2016-03-31 4 views
5

Ich überschreibe eine Methode aus einer Java-Bibliothek, und der Parameter für die Funktion ist mit @NonNull annotiert. Wenn die Methode aufgerufen wird, kommt der Parameter jedoch häufig mit einem null Wert. Wenn ich die Methode in Kotlin überschreibe, zwingt es mich, die Annotation @NonNull zu respektieren und den Parameter als nicht nullbar zu markieren. Natürlich löst Kotlin zur Laufzeit eine Ausnahme aus, wenn der Parameter mit einem Nullwert kommt. Gibt es eine Möglichkeit, wie ich die Methode in Kotlin überschreiben und die @NonNull Annotation ignorieren kann?Wie kann ich eine Java-Methode überschreiben und die Nullbarkeit eines Parameters ändern?

Insbesondere verwende ich die appcompat-Bibliothek für Android. Das Verfahren ist in AppCompatActivity.java

@CallSuper 
public void onSupportActionModeFinished(@NonNull ActionMode mode) { 
} 

Die Überschreibung in Kotlin:

override fun onSupportActionModeFinished(mode: ActionMode) { 
    super.onSupportActionModeFinished(mode) 
} 
+0

Der Grund ist es wichtig, dass Sie die ungleich NULL Muster folgen, weil es auch mit der CallSuper Anmerkung kommt. Wenn Sie einen Nullwert übergeben, gibt es keine Überprüfungen in der Supermethode, da die Annotation sicherstellen soll, dass der Wert nicht null ist. Sie werden fast sicher mit einer NPE enden. Wenn Sie diese Methode nicht explizit außerhalb des Frameworks aufrufen, sollte sie niemals einen Nullwert enthalten, da das Framework diese Annotation berücksichtigt. – zgc7009

+0

Die Bibliothek ruft diese Methode auf und übergibt einen Nullwert, nicht meinen Code. Die Bibliothek bricht ihre eigene Anmerkung. Wenn ich in Java überschreibe und erlaube, dass die Null zur Super-Methode geht, tritt keine NPE auf. – brain

+0

Was in der Welt, ja, das ist nur komisch. – zgc7009

Antwort

4

Es scheint keine einfache Art und Weise zu sein, NULL-Zulässigkeit Annotation Handhabung von Kotlin Compiler zu unterdrücken.

Als Abhilfe können Sie eine Zwischen abgeleiteten Klasse mit @Nullable Annotation in Java machen: wenn Kotlin Compiler sowohl @Nullable und @NonNull auf dem gleichen Code-Element sieht es so verhält, als ob es keine NULL-Zulässigkeit Anmerkungen waren. Dann unterteile es einfach in Kotlin. Beispiel:

Betrachten wir eine Klasse mit einem @NonNull Parameter in Java:

abstract class Base { 
    public abstract void f(@NonNull String str); 
    //... 
} 

Kotlin die Anmerkung versteht: f(str: String), der Typ ist nicht null.

erweitern Jetzt Base in Java, überschreiben die Methode und fügen Sie @Nullable Anmerkung zum Parameter in Intermediate:

abstract class Intermediate extends Base { 
    @Override 
    public abstract void f(@Nullable String str); 
} 

Für Intermediate, Kotlin f(str: String!) sieht, der Parameter hat platform type, das heißt, seine NULL-Zulässigkeit unbekannt ist.

Danach werden Sie in der Lage sein, Nullable-Parameter in einer Unterklasse von Kotlin Intermediate zu erklären:

class Derived(): Intermediate() { 
    override fun f(url: String?) { ... } 
} 
+2

Ich hoffe nur, dass sie eine Möglichkeit hinzufügen, diese Warnung für solche Fälle zu unterdrücken oder zu ignorieren. Es ist ein Schmerz, diese Zwischenklasse zu erstellen, nur um einen Parameter zu reparieren. – brain

Verwandte Themen