Если у меня есть базовый класс, подобный этому, я не мог бы изменить:
public abstract class A {
public abstract Object get(int i);
}
и я пытаюсь расширить его с помощью класса B следующим образом:
public class B extends A{
@Override
public String get(int i){
//impl
return "SomeString";
}
}
все в порядке. Но попытка попытаться использовать более общий сбой, если я попытаюсь:
public class C extends A{
@Override
public <T extends Object> T get(int i){
//impl
return (T)someObj;
}
}
Я не могу думать ни о какой причине, почему это должно быть запрещено. В моем понимании общий тип T
привязан к объекту - который является запрошенным типом возврата A
. Если я могу положить String
или AnyObject
в качестве типа возврата внутри B
, почему мне не разрешено помещать <T extends Object> T
в мой класс C
?
Еще одно странное поведение в моей точке зрения - это дополнительный метод, подобный этому:
public class D extends A{
@Override
public Object get(int i){
//impl
}
public <T extends Object> T get(int i){
//impl
}
}
Также не допускается с подсказкой DuplicateMethod
. Этот, по крайней мере, смущает меня, и я думаю, что Java должен принять решение: Является ли это ТОЛЬКО возвращенным типом, почему бы не разрешить переопределение, и если это не так, я должен был бы добавить этот метод. Чтобы сказать мне то же самое, но я не могу принять его, чтобы переопределить, очень прост в здравом смысле