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