6

该问题与 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 需要:org.rarry.sample.A[Boolean]”

任何人都可以解释为什么会这样,以及如何去做吗?

4

1 回答 1

5

要了解您的代码无法编译的原因,请首先注意 Java 使用java.lang.Boolean盒装布尔类型,而 Scala 使用scala.Boolean. 大多数情况下,当您想使用其中一个,而一个方法返回另一个(或方法参数需要另一个)时,将执行隐式转换,并使用正确的类型。

您在 Scala 中编写的方法a确实返回A[java.lang.Boolean]. A[java.lang.Boolean]因为and之间没有隐式转换,所以在这种情况下A[scala.Boolean]它不会自动返回。A[scala.Boolean]

为了验证情况是否如此,我们可以看到这个方法编译没有问题:

def a: A[java.lang.Boolean] = new AT()

重申这一点,因为我们没有隐式转换,所以这也不起作用(您将在下面看到如何修复):

val instanceOfA: A[Boolean] = a
def a = new AT()
// Error: AT doesn't conform to A[Boolean] 

To fix it, you could implicitly convert to the needed type by casting it:

implicit def toScalaABoolean(a: A[java.lang.Boolean]): A[Boolean] =
        a.asInstanceOf[A[Boolean]]

With that done, you don't even have to declare the return type of a method anymore:

implicit def toDifferentBoolean(a: A[java.lang.Boolean]): A[Boolean] = 
     a.asInstanceOf[A[Boolean]]
val instanceOfA: A[Boolean] = a
def a = new AT()
于 2013-04-08T13:49:25.750 回答