В первом примере вы используете необработанный тип Foo, поэтому сигнатура метода Foo равна public Object execute()
.Это противоречит общей версии в Bar
.На самом деле это легко воспроизвести без наследования, например:
class Foo
{
public <E> E execute() { return null; }
public Object execute() { return null; }
}
Во втором примере вы не используете необработанный тип Foo
, поэтому сигнатуры методов execute
точно совпадают.В этом случае это просто простой метод переопределения.Таким образом, вы, вероятно, должны аннотировать его.
class Bar extends Foo<Object> {
@Override
public <E> E execute() {
return null;
}
}