如何在运行时确定列表的内容类型

时间:2014-04-30 15:30:13

标签: java list casting

我有一个观察者期望来自可观察的两个可能的对象:List<Cat>List<Orange>,互斥。我如何区分传递给哪种数据类型 update(Observable observable, Object data)?由于运行时类型擦除,我无法使用if(data instanceof List<Cat>)

2 个答案:

答案 0 :(得分:2)

获取List中的第一个元素(假设不为空)并测试检索到的元素的类型。您可以使用instanceof运算符来查看对象是否在所需类的类层次结构中,但如果您想要更准确的测试,请使用getClass().equals(YourClass.class)

public void foo(List<Object> list) {
    if (!list.isEmpty()) {
        Object object = list.get(0);
        //using instanceof
        if (object instanceof Cat) {
        }
        if (object instanceof Orange) {
        }
        //using getClass().equals
        if (object.getClass().equals(Cat.class)) {
        }
        if (object.getClass().equals(Orange.class)) {
        }
    }
}

答案 1 :(得分:1)

我知道这不是真正想要的东西,但我认为这可能会有所帮助。 Wrapers可以在这种情况下提供帮助。你可以创建两个Class和一个接口:

interface SpecialList<T> {
  T get(int i);
  void add(T item);
}


class CatList implements SpecialList<Cat> {
  private List<Cat> list;
...
}

class OrangeList implements SpecialList<Orange> {
  private List<Cat> list;
...
}

然后Observable可以返回一个SpecialList对象。在这种情况下,instance of将起作用。