我有一个ArrayList,它由从db导入的不同元素组成,由字符串,数字,双精度和整数组成。有没有办法使用反射类型技术来找出每个元素包含的每种类型的数据?
仅供参考:有这么多类型的数据的原因是这是一段用不同的数据库编写的java代码。
答案 0 :(得分:99)
在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);
}
...
}
答案 1 :(得分:54)
您可以使用getClass()
方法,也可以使用instanceof。例如
for (Object obj : list) {
if (obj instanceof String) {
...
}
}
或
for (Object obj : list) {
if (obj.getClass().equals(String.class)) {
...
}
}
请注意,instanceof将匹配子类。例如,C
是A
的子类,则以下内容为真:
C c = new C();
assert c instanceof A;
但是,以下内容将是错误的:
C c = new C();
assert !c.getClass().equals(A.class)
答案 2 :(得分:45)
for (Object object : list) {
System.out.println(object.getClass().getName());
}
答案 3 :(得分:13)
你几乎从不想要使用类似的东西:
Object o = ...
if (o.getClass().equals(Foo.class)) {
...
}
因为您没有考虑可能的子类。你真的想要使用Class#isAssignableFrom:
Object o = ...
if (Foo.class.isAssignableFrom(o)) {
...
}
答案 4 :(得分:5)
在Java中只使用instanceof运算符。这也将处理子类。
ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
if(obj instanceof String){
}else if(obj instanceof Integer){
}etc...
}
答案 5 :(得分: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());
}
}
}
}
答案 6 :(得分:4)
只需在循环中的每个.getClass()
上致电Object
。
不幸的是,Java没有map()
。 :)
答案 7 :(得分:3)
如果您不依赖于特定的类,Instanceof可以工作,但请记住,您可以在列表中包含空值,因此obj.getClass()将失败,但是instanceof总是在null返回false。
答案 8 :(得分: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
}
});
答案 9 :(得分: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
答案 10 :(得分:0)
你说“这是一段正在编写的java代码”,我从中推断出你仍然有可能以不同的方式设计它。
拥有一个ArrayList就像拥有一些东西。每次从列表中获取对象时,不是强制执行instanceof或getClass,为什么不设计系统,以便在从DB中检索对象时获取对象的类型,并将其存储到适当类型的集合中。对象
或者,您可以使用众多数据访问库中的一个为您执行此操作。
答案 11 :(得分:0)
如果您希望数据以某种形式呈现数字,而您感兴趣的是将结果转换为数值,我建议:
for (Object o:list) {
Double.parseDouble(o.toString);
}