java不能隐式地将[T]强制转换为AT,其中[T]扩展为AT
这个问题与Java和Scala之间的集成有关。为了让事情更清楚,我把它简化了一点
我有两个用Java编写的类:
class A<T>{}
class AT extends A<Boolean> {}
在Java中,我有一个方法以以下方式使用这些类:
public A<Boolean> a(){
return new AT();
}
我想在scala做同样的事情。但下面的代码无法编译
def a(): A[Boolean] = {
return new AT();
}
消息说:“类型不匹配;找到:org.rarry.sample.AT required:org.rarry.sample.A[Boolean]。”
有人能解释为什么会这样,以及如何做到这一点吗
# 1 楼答案
要理解代码无法编译的原因,首先请注意Java使用
java.lang.Boolean
表示装箱布尔类型,Scala使用scala.Boolean
。大多数情况下,当您想要使用其中一个参数,而一个方法返回另一个参数(或者一个方法参数需要另一个参数)时,将执行隐式转换,并使用正确的类型您在Scala中编写的方法
a
实际上返回A[java.lang.Boolean]
。因为A[java.lang.Boolean]
和A[scala.Boolean]
之间没有隐式转换,所以在这种情况下它不会自动返回A[scala.Boolean]
为了验证这种情况,我们可以看到这种方法编译时没有问题:
为了重申这一点,因为我们没有隐式转换,这也将不起作用(您将在下面看到如何解决这个问题):
要修复它,可以通过强制转换将其隐式转换为所需的类型:
完成后,您甚至不必再声明
a
方法的返回类型: