如何找出每个对象在ArrayList <Object>中的types?

我有一个ArrayList由从db导入的不同元素组成,由string,数字,双精度和整数组成。 有没有办法使用reflectiontypes技术来找出每个元素的每种types的数据?

仅供参考:有这么多types的数据的原因是,这是一个Java代码被写入用不同的数据库来实现。

在C#中:
修正了Mike的build议

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); } ... } 

您可以使用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) 
 for (Object object : list) { System.out.println(object.getClass().getName()); } 

你几乎不希望你使用类似于:

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

因为你没有考虑到可能的子类。 你真的想要使用Class#isAssignableFrom:

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

在Java中只使用instanceof操作符。 这也将照顾子类。

 ArrayList<Object> listOfObjects = new ArrayList<Object>(); for(Object obj: listOfObjects){ if(obj instanceof String){ }else if(obj instanceof Integer){ }etc... } 
 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()); } } } } 

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

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

如果你不依赖于特定的类,Instanceof可以工作,但是也要记住,你可以在列表中有空值,所以obj.getClass()会失败,但是instanceof总是返回null。

自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 } }); 

而不是使用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 

你说“这是一段正在编写的java代码”,从中我推断你仍然有机会以不同的方式devise它。

有一个ArrayList就像有一个东西的集合。 每次从列表中取出对象时,不要强制instanceof或getClass,为什么不devise系统,以便在从数据库检索对象时获取对象的types,并将其存储到适当types的目的?

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

如果你期望数据是某种forms的数字,而你所感兴趣的是将结果转换为数值,我会build议:

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