代码之家  ›  专栏  ›  技术社区  ›  tobiasbayer

确定列表项的类型

  •  1
  • tobiasbayer  · 技术社区  · 14 年前

    List<?> list 当列表为空时,是否有方法在运行时确定该列表内容的类型?

    5 回复  |  直到 14 年前
        1
  •  2
  •   Michael D    14 年前

    不幸的是,由于擦除的原因,您无法确定列表的类型——事实上,即使列表不是空的,您仍然无法可靠地确定列表的真正内容。

    现在就说你的名单<?&燃气轮机;包含2个元素:双精度和整数。。。弄清楚它可能是一个列表是不寻常的<数字>。。。即便如此,它也可能真的是一个列表<对象>以后有人可以加上一个字符串。

    此外,假设它实际上是一个列表<列表<字符串>>。在不尝试递归的情况下,您最多会发现它是一个列表<列出<?&燃气轮机;>。

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

        2
  •  0
  •   Chii    14 年前

    是的,有。您可以迭代列表中的每个对象,调用.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
  •   froadie    14 年前

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

    list.get(0).getClass().getName();

        4
  •  0
  •   The Alchemist    14 年前

    正如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

        5
  •  0
  •   Rakesh Juyal    14 年前

    如果列表不是空的,那么 froadie 是正确的 Type erasure 找不到列表可以包含的对象类型。

    在爪哇,

    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