Скажем, у нас есть несколько тестовых интерфейсов/классов вроде этого:
abstract class Plant {
public abstract String getName();
}
interface Eatable { }
class Apple extends Plant implements Eatable {
@Override
public String getName() {
return "Apple";
}
}
class Rose extends Plant {
@Override
public String getName() {
return "Rose";
}
}
interface Animal {
<T extends Plant & Eatable> void eat(T plant);
}
Вы можете видеть, что Animal.eat
- это общий метод с ограничениями. Теперь у меня есть класс Human
:
class Human implements Animal {
@Override
public void eat(Plant plant) {
}
}
который компилируется отлично. Вы можете видеть, что Human.eat
меньше ограничений, чем Animal.eat
, потому что интерфейс Eatable
потерян.
Q1: Почему компилятор не жалуется на эту несогласованность?
Q2: Если для компилятора допустимо Plant&Eatable
понижение до Plant
, почему он жалуется на eat(Object plant)
?