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

Posted

技术标签:

【中文标题】如何找出每个对象在 ArrayList<Object> 中的类型?【英文标题】:How do I find out what type each object is in a ArrayList<Object>? 【发布时间】:2010-09-11 12:05:21 【问题描述】:

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

仅供参考:有这么多类型的数据的原因是这是一段正在编写的 java 代码,可以用不同的 DB 来实现。

【问题讨论】:

【参考方案1】:

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

【讨论】:

其实不是使用 o.GetType()==typeof(int)) 只是说 if(o is int); 如果您碰巧担心每一纳秒,与使用演员表的“is”相比,“as”会为您节省一些时间。 在java的情况下你不能只做instanceof吗? 对于Integer的情况,也应该是Integer.class,我刚试过Integer.TYPE不行。 (int) o 在 Java 中不起作用。它产生错误消息Cannot cast from Object to int。请改用(Integer o).intValue()【参考方案2】:

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

【讨论】:

【参考方案3】:
for (Object object : list) 
    System.out.println(object.getClass().getName());

【讨论】:

如果您的列表中有可能,请不要忘记 null。您将从这个带有 null 的示例中获得 NullPointerExceptions。【参考方案4】:

你几乎从不希望你使用类似的东西:

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...

【讨论】:

【参考方案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());
            
        
    

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案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
            
        );

【讨论】:

【参考方案10】:

您可以使用object.getClass().getSimpleName(),而不是使用object.getClass().getName(),因为它返回一个简单的类名,不包括包名。

例如,

Object[] intArray =  1 ; 

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

给予,

java.lang.Integer
Integer

【讨论】:

【参考方案11】:

您说“这是一段正在编写的 java 代码”,我由此推断您仍有可能以不同的方式设计它。

拥有一个 ArrayList 就像拥有一个东西的集合。与其在每次从列表中获取对象时都强制使用 instanceof 或 getClass,不如设计系统,以便在从 DB 中检索对象时获取对象的类型,并将其存储到适当类型的集合中对象?

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

【讨论】:

【参考方案12】:

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

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

【讨论】:

以上是关于如何找出每个对象在 ArrayList<Object> 中的类型?的主要内容,如果未能解决你的问题,请参考以下文章

将对象添加到指定索引处的 ArrayList

java 手工实现ArrayList版本2

有一个ArrayList,如何找出其中相同的元素及个数,说说实现原理.

如何确定 ArrayList 迭代器接下来将返回的对象类型?

如何从 ArrayList 中正确删除对象?

如何通过属性在 ArrayList 中查找对象