Scala/Java互操作:类型未转换?

gwo*_*pq9 1 interop scala typechecking

javafx api的定义如下:

void addListener(ChangeListener<? super java.lang.Boolean> listener)
Run Code Online (Sandbox Code Playgroud)

以下代码..

new TextArea().focusedProperty.addListener(new ChangeListener[Boolean]() {
  def changed(observable: ObservableValue[_ <: Boolean], oldValue: Boolean, newValue: Boolean) {
  }
})
Run Code Online (Sandbox Code Playgroud)

..给出了这个错误:

重载方法值addListener with alternatives:(javafx.beans.value.ChangeListener [_>:java.lang.Boolean])Unit(javafx.beans.InvalidationListener)Unit不能应用于(带有javafx.beans的java.lang.Object). value.ChangeListener [布尔])

如果我使用java.lang.Boolean而不是Boolean,它可以工作,但不能使用scala的布尔值.这是为什么?是否可以使用此API而无需键入完全限定的名称?

Rex*_*err 7

问题是在Scala中Boolean <: AnyVal <: Any,同时java.lang.Boolean <: AnyRef <: Any.既然<? super java.lang.Boolean>是手段java.lang.Boolean或它的任何超类,你必须落在AnyRef事物的一边.拆箱是不够的; Boolean仍然会将您置于AnyVal类型层次结构的一边,即使您将其打包成一个java.lang.Boolean.