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而无需键入完全限定的名称?
答案 0 :(得分:7)
问题在于Scala,Boolean <: AnyVal <: Any
,而java.lang.Boolean <: AnyRef <: Any
。由于<? super java.lang.Boolean>
表示java.lang.Boolean
或任何超类,因此您必须属于AnyRef
方面。拆箱是不够的; Boolean
仍然会将您置于类型层次结构的AnyVal
一侧,即使您将其加入java.lang.Boolean
。