2016-03-31 48 views
5

Nadpisuję metodę z biblioteki Java, a parametr tej funkcji został opisany jako @NonNull. Jednak, gdy wywoływana jest metoda, parametr często pojawia się z wartością null. Kiedy nadpisuję metodę w Kotlin, zmusza mnie to do przestrzegania adnotacji @NonNull i oznaczenia parametru jako nieoparty. Oczywiście, Kotlin zgłasza wyjątek w czasie wykonywania, gdy parametr przyjdzie z wartością pustą. Czy jest jakiś sposób, aby zastąpić metodę w Kotlin i zignorować adnotację @NonNull?Jak mogę przesłonić metodę java i zmienić wartość pustą parametru?

W szczególności używam biblioteki appcompat na Androida. Metoda ta jest w AppCompatActivity.java

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

Korekcja w Kotlin:

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

Powodem jest to ważne, aby postępować zgodnie z niepustych wzór, ponieważ jest również pochodzi z dopiskiem CallSuper. Jeśli przekazałeś wartość pustą, nie będzie żadnych sprawdzeń w metodzie super, ponieważ adnotacja ma zapewnić, że wartość nie jest pusta. Prawie na pewno skończy się NPE. Jeśli nie wywołujesz tej metody jawnie poza ramką, nigdy nie powinna ona mieć wartości null, ponieważ struktura będzie respektować tę adnotację. – zgc7009

+0

Biblioteka wywołuje tę metodę i przekazuje wartość pustą, a nie mój kod. Biblioteka zrywa z własną adnotacją. Kiedy przesłonię w Javie i zezwolę zeru na przejście do super metody, nie pojawia się NPE. – brain

+0

Co na świecie, to po prostu dziwne. – zgc7009

Odpowiedz

4

Wydaje się, że żaden prosty sposób stłumić wartości null obsługę adnotacji przez Kotlin kompilator.

Jako obejście, można dokonać pośrednią klasę pochodzącą z @Nullable adnotacji w Javie: kiedy Kotlin kompilator widzi zarówno @Nullable i @NonNull na tym samym elemencie kodu zachowuje się tak, jakby nie było żadnych adnotacji wartości null. Następnie podklaskuj go w Kotlin. Przykład:

Rozważmy klasę parametru Java @NonNull:

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

Kotlin rozumie adnotacji: f(str: String), typ jest niezerowe.

Teraz przedłużyć Base w Javie, zastąpić metodę i dodać @Nullable adnotacji do parametru w Intermediate:

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

Dla Intermediate, Kotlin widzi f(str: String!) parametr ma platform type, czyli jej wartości null nie jest znana.

Po tym będzie można zadeklarować zerowalne parametr w Kotlin podklasy Intermediate:

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

Mam tylko nadzieję, że dodadzą sposób na zniesienie lub zignorowanie tego ostrzeżenia w takich przypadkach. Ustanowienie tej klasy pośredniej jest trudne, aby naprawić jeden parametr. – brain