У меня есть два интерфейса, которые выглядят так:
interface Parent<T extends Number> {
T foo();
}
interface Child<T extends Integer> extends Parent<T> {
}
Если у меня есть необработанный объект Parent, вызов foo() по умолчанию возвращает Number, поскольку нет параметра типа.
Parent parent = getRawParent();
Number result = parent.foo(); // the compiler knows this returns a Number
Это имеет смысл.
Если у меня есть исходный объект Child, я бы ожидал, что вызов foo() вернет Integer по той же логике. Однако компилятор утверждает, что он возвращает Number.
Child child = getRawChild();
Integer result = child.foo(); // compiler error; foo() returns a Number, not an Integer
Я могу переопределить Parent.foo() в Child, чтобы исправить это, например:
interface Child<T extends Integer> extends Parent<T> {
@Override
T foo(); // compiler would now default to returning an Integer
}
Почему это происходит? Есть ли способ, чтобы Child.foo() по умолчанию возвращал Integer без переопределения Parent.foo()?
РЕДАКТИРОВАТЬ: Притвориться Integer не является окончательным. Я просто выбрал Number и Integer в качестве примеров, но, очевидно, это был не лучший выбор.: S