确定List条目的类型

时间:2010-08-25 13:54:30

标签: java generics

我在Java中有一个List<?> list。 当列表为空时,有没有办法在运行时确定该列表的内容类型?

5 个答案:

答案 0 :(得分:2)

不幸的是,你无法弄清楚由于擦除造成的类型 - 事实上,即使列表不是空的,你仍然无法可靠地确定列表的真正含义。

我们现在就说你的名单&lt;?&gt;包含2个元素:一个Double和整数......如果它可能是一个List&lt; Number&gt;,那将是非常重要的。 ......即便如此,它可能真的是一个List&lt; Object&gt;有人可以在以后添加一个字符串。

此外,我们说它实际上是一个List&lt; List&lt; String&gt;&gt;。你没有试图递归的最大问题是它是一个List&lt; List&lt;?&gt;&gt;。

有一个光明的一面。根据您的具体情况,您可以使用类型标记以类型安全的方式解决擦除问题。这里有一篇很棒的帖子:http://gafter.blogspot.com/2006/12/super-type-tokens.html

答案 1 :(得分:0)

假设列表中至少有一个对象,以获取列表的类型 - list.get(0).getClass().getSuperclass.getName();

获取单个对象的类型 - list.get(0).getClass().getName();

答案 2 :(得分:0)

是的,有。您可以遍历列表中的每个对象,并调用.getClass()方法并打印出其类名(或根据类来执行各种操作)。

如,

for (Object o : list) {
   if (o.getClass().equals(MyClass.class)) {
      MyClass myClass = (MyClass) o;
      //do something with myClass etc etc
   }
   //...more if statements?
}

答案 3 :(得分:0)

正如Chii所说,你可以迭代每个元素。除此之外,您无法知道,因为从技术上讲,您可以将任何对象放在List中。

如,

    List list = new ArrayList();
    list.add(new Integer(1));
    list.add(new Integer(2));
    list.add("string");
    list.add(new Double(0.2));

在上面的示例中,list的类型是什么?这个问题没有答案。

答案 4 :(得分:0)

如果列表不为空,则froadie是正确的 但如果列表为空,则根据Type erasure,无法找到List可以拥有的对象类型。

在java中,

ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) // evaluates to true
  System.out.println("Equal");

来源:http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure