【问题标题】:list of any collection type, also with a generic data type任何集合类型的列表,也具有通用数据类型
【发布时间】:2014-11-21 00:50:11
【问题描述】:

我正在尝试修改下面的类,使其函数接受任何来自集合的数据类型,这些集合的数据类型也是通用的,从而实现最大的灵活性:

public class Container<E> {
   List<E> cont;
   public Container() { 
        cont = new java.util.LinkedList<T>(); 
   }
   void add(E item) {
        cont.add(item);
   }
   public E remove() {
        return cont.remove(0);
   }
   void addMulti(List<E> items) {
        for (E elem : items) {
              cont.add(elem);
        } 
   }
   void removeMulti(int x, List<E> items) {
        for (E elem : cont.subList(0, n)) {
              items.add(elem);
        }
        for (int i=0; i<x; ++i) cont.remove(0);
   }
}

我正在尝试使用通配符让 List 接受多种类型,例如:

 List<?> //Right?? 

此外,addAll 和 removeAll 函数应该接受任何类型的列表作为参数,而不仅仅是 List,不能像这样:

Collection<?> //Correct???

谢谢!

【问题讨论】:

  • 你现在有什么问题?
  • ...以及问题陈述?
  • 我正在尝试使用通配符让 List 接受多种类型,例如 List> ??此外,addAll 和 removeAll 函数应该接受任何类型的列表作为参数,而不仅仅是 List,例如 Collection> ???
  • 抱歉,不清楚。我真的很感谢你的帮助!我修好了

标签: java list object generics


【解决方案1】:

对于addMulti,您不想接受Collection&lt;?&gt;,因为您不能正确地说它包含与E 兼容的元素。为获得最大的通用性,您可以接受Collection&lt;? extends E&gt;,它表示该集合包含EE 的某个子类。

void addMulti(Collection<? extends E> items) {...}

对于removeMulti,是的,您可以接受Collection&lt;?&gt;,因为如果集合中某些元素的类型与E 不兼容,则根本不会将其删除。

void removeMulti(int x, Collection<?> items) {...}

但是,如果您在removeMulti 中获取通配符集合,您将无法添加到items。 (我真的不明白你的代码应该在那里做什么。)

这是Collection#addAllCollection#removeAll 的定义方式。

【讨论】:

  • 感谢您的回复。那么我应该如何声明 List cont 呢?我应该保持原样吗?
  • 代码是一个赋值。它不是为了做任何事情!
  • 据我所知,List&lt;E&gt; 适合 cont。当我们不特别关心类型是什么时,我们只使用通配符。 Collection&lt;?&gt; 有点像 Collection&lt;don't know/don't care&gt;
猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多