/ / Scala / Java-Interop: Klassentyp nicht konvertiert? - Scala, Interop, Typchecking

Scala / Java-Interop: Klassentyp nicht konvertiert? - Scala, Interop, Typenkontrolle

Die javafx-API ist wie folgt definiert:

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

Der folgende Code ..

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

..gibt diesen Fehler:

überladener Methodenwert addListener mitAlternativen: (javafx.beans.value.ChangeListener [_>: java.lang.Boolean]) Unit (javafx.beans.InvalidationListener) Einheit kann nicht angewendet werden (java.lang.Object mit javafx.beans.value.ChangeListener [Boolean])

Wenn ich benutze java.lang.Boolean Anstatt von Booleanfunktioniert, aber nicht mit scala "s Boolean. Warum ist das so? Ist es möglich, diese API zu verwenden, ohne den vollständig qualifizierten Namen eingeben zu müssen?

Antworten:

7 für die Antwort № 1

Das Problem ist, dass in Scala, Boolean <: AnyVal <: Any, während java.lang.Boolean <: AnyRef <: Any. Schon seit <? super java.lang.Boolean> meint java.lang.Boolean oder irgendein Oberklasse davon, müssen Sie in die fallen AnyRef Seite der Dinge. Unboxing ist nicht genug; Boolean setzt dich trotzdem auf die AnyVal Seite der Typhierarchie, auch wenn Sie es in eine Box würden java.lang.Boolean.