2012-07-07 1 views
1

자바 FX API는 다음과 같이 정의된다 :스칼라/자바 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이 오류 :

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])

을 내가 java.lang.Boolean 대신 Boolean 사용하는 경우, 그것은 작동하지만 scala의 Boolean과는 작동하지 않습니다. 왜 그런가요? 완전한 이름을 입력 할 필요없이이 API를 사용할 수 있습니까?

답변

7

문제는 스칼라에서 Boolean <: AnyVal <: Any 인 반면 java.lang.Boolean <: AnyRef <: Any입니다. <? super java.lang.Boolean>java.lang.Boolean 또는 을 의미하므로 수퍼 클래스의 경우 AnyRef 항목에 속해야합니다. Unboxing으로 충분하지 않습니다. Booleanjava.lang.Boolean에 상자로 묶어도 형식 계층의 AnyVal면에 계속 배치됩니다.