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


87

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

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

Answers:


100

在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((Integer o).intValue());
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

3
实际上不是使用o.GetType()== typeof(int))而是说if(o is int);
Michael Brown

而且,如果您碰巧担心每纳秒的时间,那么与“是”相比,“ as”将为您节省一些时间。
尼尔

47
您不能只instanceof在Java情况下做吗?
剃刀风暴

2
对于Integer的情况,它也应该是Integer.class,我刚刚尝试了Integer.TYPE不起作用。
艾伦

(int) o在Java中不起作用。它产生错误消息Cannot cast from Object to int。使用(Integer o).intValue()代替。
最多

54

您可以使用该getClass()方法,也可以使用instanceof。例如

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

要么

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

请注意,instanceof将匹配子类。例如,of C是的子类A,则以下内容将成立:

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

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

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


13

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

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

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

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

5

在Java中,只需使用instanceof运算符。这也将照顾子类。

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}

5
import java.util.ArrayList;

/**
 * @author potter
 *
 */
public class storeAny {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Object> anyTy=new ArrayList<Object>();
        anyTy.add(new Integer(1));
        anyTy.add(new String("Jesus"));
        anyTy.add(new Double(12.88));
        anyTy.add(new Double(12.89));
        anyTy.add(new Double(12.84));
        anyTy.add(new Double(12.82));

        for (Object o : anyTy) {
            if(o instanceof String){
                System.out.println(o.toString());
            } else if(o instanceof Integer) {
                System.out.println(o.toString());   
            } else if(o instanceof Double) {
                System.out.println(o.toString());
            }
        }
    }
}

4

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

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


3

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


3

从Java 8开始


        mixedArrayList.forEach((o) -> {
            String type = o.getClass().getSimpleName();
            switch (type) {
                case "String":
                    // treat as a String
                    break;
                case "Integer":
                    // treat as an int
                    break;
                case "Double":
                    // treat as a double
                    break;
                ...
                default:
                    // whatever
            }
        });


2

object.getClass().getName()可以使用代替使用object.getClass().getSimpleName(),因为它会返回一个简单的类名,其中不包含包名。

例如,

Object[] intArray = { 1 }; 

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

给,

java.lang.Integer
Integer

0

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

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

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


0

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

for (Object o:list) {
  Double.parseDouble(o.toString);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.