有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    您在Scala中编写的方法a实际上返回A[java.lang.Boolean]。因为A[java.lang.Boolean]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] 
    

    要修复它,可以通过强制转换将其隐式转换为所需的类型:

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

    完成后,您甚至不必再声明a方法的返回类型:

    implicit def toDifferentBoolean(a: A[java.lang.Boolean]): A[Boolean] = 
         a.asInstanceOf[A[Boolean]]
    val instanceOfA: A[Boolean] = a
    def a = new AT()