1

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[_ >: java.lang.Boolean])Unit (javafx.beans.InvalidationListener)Unit 不能应用于 (java.lang.Object with javafx.beans. value.ChangeListener[Boolean])

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

4

1 回答 1

7

问题是在 Scala 中,Boolean <: AnyVal <: Any, 而java.lang.Boolean <: AnyRef <: Any. 既然<? super java.lang.Boolean>手段java.lang.Boolean或它的任何超类,你必须落入AnyRef事物的一边。拆箱是不够的;Boolean即使您将AnyVal其装箱到java.lang.Boolean.

于 2012-07-07T18:08:23.780 回答