2010-11-08 82 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; 
}