问题:类型不匹配错误

问题描述:

假设我有以下接口:问题:类型不匹配错误

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; 
    } 
} 
+0

你所描述的技术术语是**协变**。搜索一下,你会发现很多重复的东西,包括这一个:[任何简单的方法来解释为什么我不能做'List animals = new ArrayList ()'?](http:// *。问题/ 2346763/any-simple-way-to-explain-why-i-can-do-list-animal-animals-new-arraylistdo) –

+0

@Daniel Pryden:谢谢你的技术术语。 – Heisenbug

因为Vector明确由的Interface<T>,没有东西延伸Interface<T>,我相信,如果你改变了定义

public Vector<? extends Interface<T>> getVector(); 

问题这样的工作是,对于一些V implements TV extends TFoo<V>是不是超类型的Foo<T>。编译器不会在通用参数上测试继承,除非您明确指出该扩展点。

使用Vector<? extends Interface<T>>意思是“允许实现或者扩展Interface<T>任何一类,而​​指由唯一的Interface<T>项目的载体。

也许是更具体的考虑到List<Integer>不是List<Number>扩展可接受的替代尽管IntegerNumber的正是同样的原因

更新

我测试了这个和下面的编译没有任何错误或警告

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; 
    } 
} 
+0

您还必须将方法签名更改为“C”子类中的'public Vector > getVector()'以便编译。 'Vector >'不是'Vector >'的子类,因此返回不是该方法应该返回的子类的东西显然是不允许的。 – toto2

+0

+1:但我编辑了我的问题。你能帮我澄清一下吗?是一个与泛型相关的问题吧? – Heisenbug

+0

@ toto2:不,它编译得很好,我建议修改(请参阅我的编辑) –

这是仿制药的工作方式。它们不是“协变的”:如果您有AClass及其子类SubAClass,Vector<SubAClass>不是Vector<A>的子类。 (但是请注意,SubAClass[]AClass[]一个子类)。

编辑:

看似显而易见的:

public ArrayList<Object> blah() { 
    return new ArrayList<String>(); 
} 

不能编译,因为ArrayList<String>不是一个子类别ArrayList<Object>。所以在你的情况下,你不能为​​返回Vector<C<T>>实例。

+0

+1:所以我的猜测是正确的吗?与泛型有关的问题是什么? – Heisenbug

+0

@Overbose是的,看我的编辑。 – toto2

+0

我看不出你的编辑如何解决我的疑惑 – Heisenbug