2012-09-03 32 views
0

可能重複:
Most efficient way to cast List<SubClass> to List<BaseClass>
why polymorphism doesn't treat generic collections and plain arrays the same way?傳遞收集<SubClass>很快會收集<BaseClass>功能無法在Java中

如果我有一個抽象基類BaseClass和我寫一個函數期待Collection<BaseClass>作爲它的參數,調用該函數的一個Collection<SubClass>SubClass extends BaseClass無法編譯。

在基類:

public void addLots(Collection<BaseClass> collection) { 
    for(BaseClass yourbase : collection) { 
     us.add(yourbase) //what you say!! 
    } 
} 

而在子類:

public void addMoreLots(Collection<SubClass> collection) { 
    addLots(collection); //FAILS TO COMPILE 
} 

現在,我想我能明白爲什麼是這樣的:Collection<SubClass>不是Collection<BaseClass>一個子類。什麼是正確進行此調用的方法?

+0

謝謝 - 雖然我找不到它,但我認爲這解決了一個不同的問題(更關注於「我該怎麼做」,更少關注「爲什麼數組不同於集合」)。這個假設適用於任何通用的,例如'WeakReference'。 –

+0

PresumablY。 Dagnammit。 –

回答

1

Collections在編譯時間not運行時只是檢查,所以這樣做是爲了做保護集合採取錯誤的類型對象英寸

試試這樣...

public <T extends BaseClass> void addLots(Collection<T> collection){ }

OR

public void addLots(Collection<? extends BaseClass> collection) {}

+0

我已經解決了,併發布了自己的答案,但是謝謝你:) –

+1

@AndrewWyld,沒有什麼比自己找到答案更有趣也更鼓舞人心的了......繼續......但請看看我有提及兩種方式來做到這一點..... –

+0

好點。謝謝:) –

1

<? extends BaseClass>應取代<BaseClass>。爲addLots正確的語法是:

public void addLots(Collection<? extends BaseClass> collection) { 
    for(BaseClass yourbase : collection) { 
     us.add(yourbase) //what you say!! 
    } 
} 
1

可以使用的

public void addLots(Collection<? extends BaseClass> collection) { 
} 

代替

public void addLots(Collection<BaseClass> collection) { 
} 

其表示的延伸的基類可以是一個參數類型Collection

+0

我已經解決了它,看下面,但謝謝:) –

+0

太棒了。路要走。 – SiB

0
public void addLots(Collection<? extends BaseClass> collection) { 
} 

但這個你不能叫加至收集(即你不能做collection.add()),
但在這個

public void addLots(Collection<? super SubClass> collection) { 
} 

你可以調用add(即你可以做collection.add())。

2

在捏,Collections.unmodifiableCollection(Collection<SubClass>)可以返回Collection<BaseClass>。(它使得該集合當然是不可修改的,但是這正是將Collection<SubClass>當作Collection<BaseClass>來處理是安全的。)