2010-11-08 81 views
4

我正在將List接口實現爲將數據存儲在<T>類型數組中的類。這會產生以Collection爲參數的方法的問題,因爲Collection將對象存儲爲Object。如何將Object轉換爲T?簡單的鑄造不起作用。Casting Objects to <T> -type

class MyCollection<T> implements List<T>{ 
    T[] tab; 

    MyCollection() { 
     this.tab = (T[])new Object[10]; 
    } 

    public boolean addAll(Collection c){ 
     for(Object o : c){ 
      o = (T)o; 
      for(int i = 0; i < tab.length; i++){ 
       tab[i] = o; 
      } 
     } 
    } 

} 

我想:

public boolean addAll(Collection<? extends T> c) 

但它失敗:

public boolean retainAll(Collection<?> c)因爲我不能改變集合類型在這裏:/

public boolean retainAll(Collection<?> c){ 
    boolean result = false; 
    for(T t : c){ 
    } 
    return result; 
} 
+0

你是如何實現'retainAll(Coll ...)'? – 2010-11-08 04:24:48

+0

編輯與實施 – mastodon 2010-11-08 04:33:32

回答

1

是它正確的方法?

是的,這是正確的做法。這就是接口被定義爲(除了接口使用E,但沒關係)。

請注意,您的addAll應返回boolean。此外,您不需要投入已實施的addAll。改變你的循環,而不是:

你返回 boolean
for(T o : c){...} 

和你retainAll應該罰款以及,只要。

編輯:

爲了您retainAll實現,不應該有一個需要遍歷在Collection<?>傳遞和轉換爲一個T。考慮迭代你的tab支持數組,並查看每個實例是否包含在傳入的Collection<?> c中。如果由於某種原因,你絕對需要使用c內的物品作爲T,你可以施放。

+0

在retainAll我越來越'不兼容的類型。必需T,找到java.lang.Object' – mastodon 2010-11-08 04:32:26

1

你應該定義你的方法的addAll像這樣:

public boolean addAll(Collection<? extends T> c) {...} 

這就是它如何在Java API

+0

如果retainAll給你帶來麻煩,你應該覆蓋收集中的所有保留。其他建議可行,但我認爲這個建議「更正確」。 – 2010-11-08 05:15:36

1

鑄造到T在已定義來實現retainAll(...)不是必需的。例如:

public boolean retainAll(Collection<?> c){ 
    boolean result = false; 
    Iterator<T> it = this.iterator(); 
    while (it.hasNext()) { 
     T t : it.next(); 
     if (!c.contains(t)) { 
      it.remove(); 
      result = true; 
     } 
    } 
    return result; 
}