Почему работает с Kotlin с самого начала ... В Java наличие двух методов, таких как:
private static String test() {
return "";
}
private static <T> T test() {
return null;
}
, приведет к ошибке времени компиляции.И для разработчиков Java это вроде очевидно, эти методы будут иметь стирание одного и того же типа. Но это правило, налагаемое javac
, , а не на JVM
, где выполняется этот код.Таким образом, javac
не рассматривает два метода как имеющие только другого возвращаемого типа в качестве перегрузок.Ну, kotlin
- это другой язык, и поскольку он работает на JVM
(который ожидает действительный байт-код), он позволяет обрабатывать методы только с * , тип возвращаемого значения отличается от перегрузок.Мне еще предстоит взглянуть на байт-код и понять, как это происходит;также кажется, что это будет работать только для общего кода, поэтому стирание типов может немного отличаться в случае kotlin.
Теперь должно быть очевидно, почему не удается вызвать такой метод из Java.Для этого Котлин предлагает удобное решение: @JvmName("someDistinctName")
.Я не совсем уверен, как это работает под капотом либо ... пока, хотя я предполагаю, что это создаст метод моста.
EDIT
@JvmName
будетпереименуйте метод на уровне байт-кода.