У меня есть два интерфейса, которые выглядят так:
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