要了解您的代码无法编译的原因,请首先注意 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()