Я натолкнулся на аннотацию @JvmSynthetic
в kotlin-stdlib, и мне интересно, для чего она нужна, но, к сожалению, она не документирована. (UPD: это было в тот момент)
Насколько я понимаю, применение его к элементу программы добавит synthetic
модификатор к соответствующим элементам байт-кода. Как следствие, элемент становится невидимым из Java:
class MyClass {
@JvmSynthetic
fun f() { }
}
Где-то в коде Java:
MyClass c = new MyClass();
c.f() // Error: cannot resolve method f()
Но те же элементы все еще видны в коде Kotlin:
val c = MyClass()
c.f() // OK
Является ли скрытое объявление из не-котлинских источников допустимым использованием @JvmSynthetic
? Это предполагаемое использование? Каковы другие соответствующие случаи использования?
Поскольку @JvmSynthetic
скрывает функции от Java, они также не могут быть переопределены в Java (и когда дело доходит до abstract
члена, вызовы затем приводят к AbstractMethodError
). Учитывая это, могу ли я использовать @JvmSynthetic
чтобы запретить переопределение членов класса Kotlin в источниках Java?