2012-07-07 42 views
1

JavaFX的API的定義如下:Scala/Java interop:類型未轉換?

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

下面的代碼..

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

..gives此錯誤:如果我使用java.lang.Boolean代替Boolean

overloaded method value addListener with alternatives: (javafx.beans.value.ChangeListener[_ >: java.lang.Boolean])Unit (javafx.beans.InvalidationListener)Unit cannot be applied to (java.lang.Object with javafx.beans.value.ChangeListener[Boolean])

,它的工作原理,但不是與斯卡拉布爾。這是爲什麼?是否有可能使用這個API而不必輸入完全限定名稱?

回答

7

問題是,在斯卡拉,Boolean <: AnyVal <: Any,而java.lang.Boolean <: AnyRef <: Any。由於<? super java.lang.Boolean>意味着java.lang.Boolean的任何它的超類,你必須陷入AnyRef的一面。拆箱不夠; Boolean仍然會將您置於類型層次結構的AnyVal一側,即使您將其放入java.lang.Boolean