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

时间:2012-07-07 17:53:34

标签: scala interop typechecking

javafx api的定义如下:

void addListener(ChangeListener<? super java.lang.Boolean> listener)

以下代码..

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

..给出了这个错误:

  

重载方法值addListener与替代品:   (javafx.beans.value.ChangeListener [_&gt;:java.lang.Boolean])单位   (javafx.beans.InvalidationListener)无法应用单位   (java.lang.Object with javafx.beans.value.ChangeListener [Boolean])

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

1 个答案:

答案 0 :(得分:7)

问题在于Scala,Boolean <: AnyVal <: Any,而java.lang.Boolean <: AnyRef <: Any。由于<? super java.lang.Boolean>表示java.lang.Boolean任何超类,因此您必须属于AnyRef方面。拆箱是不够的; Boolean仍然会将您置于类型层次结构的AnyVal一侧,即使您将其加入java.lang.Boolean