假设我有以下界面:
public interface Interface<T extends Number>{
public Vector<Interface<T>> getVector();
}
以及实现该接口的以下类:
public abstract class C<T extends Number> implements Interface<T>{
private Vector<C<T>> vector;
public Vector<Interface<T>> getVector(){ //errror
return this.vector;
}
}
为什么不合法返回Vector<C<T>>
同时合法(显然)返回Vector<Interface<T>>
。 C
实际上正在实施Interface
,所以它应该是可能的,对吧?我错过了什么?
编辑:
为什么这个非泛型界面工作?这实际上是一个通用的相关问题吗?
public interface Interface{
public Interface getVector();
}
public abstract class C implements Interface {
private C;
public Interface getVector(){ //errror
return this.c;
}
}
答案 0 :(得分:2)
由于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;
}
}
的原因完全相同,但更为具体。
<强>更新强>:
我对此进行了测试,以下编译没有任何错误或警告
{{1}}
答案 1 :(得分:1)
这是仿制药的工作方式。它们不是“协变”:如果您有类AClass
及其子类SubAClass
,Vector<SubAClass>
不是Vector<A>
的子类。 (但请注意,SubAClass[]
是AClass[]
的子类。)
编辑:
看似显而易见:
public ArrayList<Object> blah() {
return new ArrayList<String>();
}
将无法编译,因为ArrayList<String>
不是子类ArrayList<Object>
。因此,在您的情况下,您无法为Vector<C<T>>
返回Vector<Interface<T>>
个实例。