如何找出ArrayList <Object>中每个对象的类型?

时间:2020-03-06 14:28:12  来源:igfitidea点击:

我有一个由从数据库导入的不同元素组成的ArrayList,它由字符串,数字,双精度数和整数组成。有没有一种方法可以使用反射类型技术来找出每个元素持有的每种数据类型?

仅供参考:数据类型如此之多的原因是,这是一段要编写的Java代码,可以通过不同的DB来实现。

解决方案

只需在每个Object中循环调用.getClass()

不幸的是,Java没有map()。 :)

在C#中:
在Mike的建议下修正

ArrayList list = ...;
// List<object> list = ...;
foreach (object o in list) {
    if (o is int) {
        HandleInt((int)o);
    }
    else if (o is string) {
        HandleString((string)o);
    }
    ...
}

在Java中:

ArrayList<Object> list = ...;
for (Object o : list) {
    if (o instanceof Integer)) {
        handleInt((int)o);
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

for (Object object : list) {
    System.out.println(object.getClass().getName());
}

我们可以使用getClass()方法,也可以使用instanceof。例如

for (Object obj : list) {
  if (obj instanceof String) {
   ...
  }
}

或者

for (Object obj : list) {
 if (obj.getClass().equals(String.class)) {
   ...
 }
}

请注意,instanceof将匹配子类。例如,CA的子类,则以下条件成立:

C c = new C();
assert c instanceof A;

但是,以下内容将是错误的:

C c = new C();
assert !c.getClass().equals(A.class)

如果我们不依赖特定的类,那么instanceof可以工作,但要记住,列表中可以包含null,因此obj.getClass()将失败,但是instanceof始终在null时返回false。

我们说"这是一段正在编写的Java代码",据我推断,我们仍有可能以其他方式设计它。

拥有ArrayList就像拥有一些东西。与其每次从列表中获取一个对象时都不强制执行instanceof或者getClass,而是为什么不设计系统,以便在从数据库中检索对象时将其类型获取,并将其存储到适当类型的集合中。目的?

或者,我们可以使用现有的许多数据访问库之一来为我们执行此操作。

我们几乎从不希望使用以下内容:

Object o = ...
if (o.getClass().equals(Foo.class)) {
    ...
}

因为我们没有考虑可能的子类。我们确实要使用Class#isAssignableFrom:

Object o = ...
if (Foo.class.isAssignableFrom(o)) {
    ...
}

如果我们希望数据以某种形式为数字,而我们感兴趣的只是将结果转换为数字值,我建议:

for (Object o:list) {
  Double.parseDouble(o.toString);
}