问题:类型不匹配错误
问题描述:
假设我有以下接口:问题:类型不匹配错误
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>>
同时合法(显然)返回。 C
实际上是实施Interface
,所以应该可以吧?我错过了什么?
编辑:
为什么这项工作非泛型接口?这实际上是一个通用的相关问题吗?
public interface Interface{
public Interface getVector();
}
public abstract class C implements Interface {
private C;
public Interface getVector(){ //errror
return this.c;
}
}
答
因为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>
任何一类,而指由唯一的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;
}
}
答
这是仿制药的工作方式。它们不是“协变的”:如果您有AClass
及其子类SubAClass
,Vector<SubAClass>
不是Vector<A>
的子类。 (但是请注意,SubAClass[]
是AClass[]
一个子类)。
编辑:
看似显而易见的:
public ArrayList<Object> blah() {
return new ArrayList<String>();
}
不能编译,因为ArrayList<String>
不是一个子类别ArrayList<Object>
。所以在你的情况下,你不能为返回Vector<C<T>>
实例。
你所描述的技术术语是**协变**。搜索一下,你会发现很多重复的东西,包括这一个:[任何简单的方法来解释为什么我不能做'List animals = new ArrayList ()'?](http:// *。问题/ 2346763/any-simple-way-to-explain-why-i-can-do-list-animal-animals-new-arraylistdo) –
@Daniel Pryden:谢谢你的技术术语。 – Heisenbug