Znalazłem adnotację @JvmSynthetic
w kotlin-stdlib i zastanawiam się, do czego to służy, ale, niestety, jest to nieudokumentowane.Jakie jest przeznaczenie @JvmSynthetic w Kotlin?
O ile rozumiem, zastosowanie go do elementu programu doda modyfikator synthetic
do odpowiednich elementów kodu bajtowego. W konsekwencji, element staje się niewidoczny z Java:
class MyClass {
@JvmSynthetic
fun f() { }
}
Gdzieś w kodzie Java:
MyClass c = new MyClass();
c.f() // Error: cannot resolve method f()
Ale te same elementy są nadal widoczne w kodzie Kotlin:
val c = MyClass()
c.f() // OK
ukrywa deklaracje ze źródeł innych niż kotlin ważne użycie @JvmSynthetic
? Czy to jest zamierzone użycie? Jakie są inne odpowiednie przypadki użycia?
Od @JvmSynthetic
ukrywa funkcje z Jawy, nie mogą one zostać zastąpione w Javie albo (a jeśli chodzi o człon abstract
, rozmowy następnie doprowadzić do AbstractMethodError
). Biorąc pod uwagę to, czy mogę użyć @JvmSynthetic
, aby zabronić nadpisywania członków klasy Kotlin w źródłach Java?
Zgadzam się, że wygląda to jak niebezpieczne narzędzie, które wymaga ostrożnej obsługi , ale nadal jest częścią 'kotlin-stdlib', jest to publiczny interfejs API. Daje mi do myślenia, że powinny być przypadki użycia '@ JvmSynthetic', które może napotkać zwykły programista (lub może programista bibliotek/narzędzi). Ponadto, 'syntetyczne' metody są używane szersze przez' javac', a następnie tylko dla zagnieżdżonych klas: przynajmniej dla nadpisania metody z innym sygnaturą (włączając ogólne metody nadpisane nietypowymi). – hotkey