Поскольку Vector
явно состоит из Interface<T>
, а не вещей, которые расширяют Interface<T>
, я считаю, что это сработает, если вы измените определение на
public Vector<? extends Interface<T>> getVector();
Проблема в том, что для некоторых V implements T
или V extends T
Foo<V>
не является супертипом Foo<T>
. Компилятор не проверяет наследование общих аргументов, если вы явно не укажете эту точку расширения.
Использование Vector<? extends Interface<T>>
означает «разрешить любой класс, который реализует или расширяет Interface<T>
, тогда как Vector<Interface<T>>
означает вектор, состоящий только из Interface<T>
элементов.
Возможно, более конкретно следует учитывать, что List<Integer>
не является приемлемой заменой для List<Number>
, несмотря на то, что Integer
расширяет Number
по той же причине.
обновление
Я протестировал этот и следующие компиляторы без каких-либо ошибок или предупреждений
interface Interface<T extends Number>{
public Vector<? extends Interface<T>> getVector();
}
abstract class C<T extends Number> implements Interface<T>{
private Vector<C<T>> vector;
public Vector<? extends Interface<T>> getVector(){
return this.vector;
}
}