列表中的Java泛型,如何处理List <myclass <?>&gt; </myclass <?>

时间:2011-03-22 07:26:11

标签: java generics wildcard

我有一个班级MyObject<T>和一个列表:List<MyObject<?>>

列表内容(示例):

  • MyObject<Date>();
  • MyObject<Integer>();

然后MyObject<T>类包含一个函数:

public T getValue() {
    return this.someAttribute;
}

如何迭代我的List并调用getValue方法?

5 个答案:

答案 0 :(得分:1)

for (myObject<?> obj : aList) {
    obj.getValue();
}

答案 1 :(得分:1)

    List<Myclass<?>> t  = new ArrayList<Myclass<?>>();
    Iterator<Myclass<?>> iter = t.iterator();
    while (iter.hasNext()) {
        Myclass<?> next = iter.next();
        Object value = next.getValue();
        System.out.println(value);
    }

答案 2 :(得分:0)

试试这个

for (MyObject obj : yourList){
   T value = obj.getValue();
}

答案 3 :(得分:0)

  

关键是,项目的结果应该是特定于类型的。它是解析框架的一部分。

结果不能是特定于类型的,因为您的列表包含参数化MyObject注意的混合物,我从现在开始使用大写符号...)。结果将是Object类型,您必须使用instanceof并投射。

示例代码:

public class MyObject<T> {
  private T value;
  public T getValue() {return value;}

  // ...
}

现在我们制作一个列表摘录:

List<MyObject<?>> list = new ArrayList<MyObject<?>>(){
                               new MyObject<Integer>(), new MyObject<String>()};
for (MyObject<?> item:list) {
  Object itemValue = list.getValue();
}

从这个示例中我们看到我们无法转换为除Object之外的任何其他类型 - 因为该集合包含MyObject个方法返回getValue()或{的Integer个实例{1}}。

答案 4 :(得分:0)

调用方法没有问题,问题是你需要对返回值做什么。

for (MyObject<?> obj : aList) 
    call( obj );

static <T> call(MyObject<T> obj)
{
    T val = obj.getValue();
}

由于通配符捕获,我们可以将MyObject<?>call()方法作为MyObject<T> arg提供。