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 Boolean
funktioniert, 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 № 1Das 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
.