关于Java中的接口和泛型的问题:类型不匹配错误

时间:2011-09-01 23:37:44

标签: java generics interface

假设我有以下界面:

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

2 个答案:

答案 0 :(得分:2)

由于Vector明确地由Interface<T>组成,而不是Interface<T>扩展的内容,我相信如果您将定义更改为

,这将有效
 public Vector<? extends Interface<T>> getVector();

问题在于某些V implements TV 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及其子类SubAClassVector<SubAClass>不是Vector<A>的子类。 (但请注意,SubAClass[]AClass[]的子类。)

编辑:

看似显而易见:

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

将无法编译,因为ArrayList<String>不是子类ArrayList<Object>。因此,在您的情况下,您无法为Vector<C<T>>返回Vector<Interface<T>>个实例。