Следующий код работает при компиляции с исходной совместимостью = 1.7 или 1.6, но после переключения на 1.8:
public class Java8Wat {
interface Parcelable {
}
static class Bundle implements Parcelable {
public void put(Parcelable parcelable) {
}
public void put(Serializable serializable) {
}
public <T extends Parcelable> T getParcelable() {
return null;
}
}
static {
Bundle inBundle = new Bundle();
Bundle outBundle = new Bundle();
outBundle.put(inBundle.getParcelable());
}
}
Вывод компиляции:
Java8Wat.java:23: error: reference to put is ambiguous
outBundle.put(inBundle.getParcelable());
^
both method put(Parcelable) in Bundle and method put(Serializable) in Bundle match
Здесь репо с кодом ошибки: https://github.com/chalup/java8-wat. Просто запустите ./gradlew clean build
из каталога проекта.
Я просматривал JLS для Java 8, но я не нашел ничего подходящего.
Дополнительное наблюдение: код компилируется, если я изменяю подпись getParcelable()
на:
public Parcelable getParcelable()
Почему компилятор java считает put(Serializable)
потенциально применимым методом для вызова outBundle.put(inBundle.getParcelable())
и какие изменения следует внести в класс Parcelable/Bundle? Бонусный вопрос: почему эта ошибка возникает только на Java 8, а не на Java 7?