Вот мой Kotlin (версия 1.3.61) + Java (1.8.0_201) код, который не удалось скомпилировать:
Maven:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>2.0.1</version>
</dependency>
Test.Kt :
fun main(args: Array<String>) {
Point().setX(1)
}
Точка. java:
import javax.annotation.Nonnull;
public class Point {
public void setX(int x) {
}
public void setX(@Nonnull Integer x) {
}
}
Не удалось скомпилировать из-за следующей ошибки:
Error:(2, 13) Kotlin: Overload resolution ambiguity:
public open fun setX(@Nonnull x: Int): Unit defined in Point
public open fun setX(x: Int): Unit defined in Point
Если я удалил @NonNull
аннотацию во второй setX
функции, тогда это демо может скомпилироваться. Я думал, что Java аннотация была только дополнительными метаданными и не повлияла бы на сам код, поэтому я понятия не имел, почему здесь возникла неоднозначность.
Кроме того, я запускаю javap -s Point.class
и обнаружил, что они имеют одинаковый вывод :
public void setX(java.lang.Integer);
descriptor: (Ljava/lang/Integer;)V
Может кто-нибудь помочь объяснить, что здесь происходит? Заранее спасибо.