2012-07-07 77 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