如何才能知道每个对象是一个ArrayList的是什么类型 ? 如何才能知道每个对象是一个Arr

2019-05-14 07:23发布

我有由来自DB的进口不同的元素,组成的字符串,数字,双打和INTS的ArrayList的。 有没有办法使用反射型技术,找出每类元素保存的数据有什么办法?

FYI:之所以有这么多类型的数据是,这是被写入一块Java代码与不同的数据库的实现。

Answer 1:

在C#:
从推荐固定麦克

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


Answer 2:

您可以使用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)


Answer 3:

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


Answer 4:

你几乎从来不希望你使用这样的:

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

因为你不占可能的子类。 你真的想使用Class#isAssignableFrom:

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


Answer 5:

在Java中只使用instanceof运算符。 这也将采取子类的照顾。

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


Answer 6:

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


Answer 7:

只需拨打.getClass()上的每个Object在一个循环。

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



Answer 8:

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



Answer 9:

由于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 } }); 



Answer 10:

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


Answer 11:

你说:“这是一块java代码被写入”,从中我推断,还有,你可以设计一个不同方式的机会。

有一个ArrayList就像有东西的集合。 而不是强制的instanceof或的getClass每次你把一个对象从列表中的时候,为什么不设计系统,让你当你从数据库中检索获取对象的类型,并将其存储到相应类型的集合宾语?

或者,你可以用它存在为你做这个的很多数据访问库之一。



Answer 12:

如果你希望数据是在某种形式的数字,和你有兴趣做的结果转换为数值,我建议:

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


文章来源: How do I find out what type each object is in a ArrayList?