2011-09-01 78 views
2

假設我有以下接口:問題:類型不匹配錯誤

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:// stackoverflow。問題/ 2346763/any-simple-way-to-explain-why-i-can-do-list-animal-animals-new-arraylistdo) –

+0

@Daniel Pryden:謝謝你的技術術語。 – Heisenbug

回答

2

因爲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:不,它編譯得很好,我建議修改(請參閱我的編輯) –

1

這是仿製藥的工作方式。它們不是「協變的」:如果您有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