查找数组中给定类的所有实例

时间:2012-06-20 03:21:37

标签: java

我有一个程序,我需要在数组中查找类的所有实例。我想创建一个为我做这个的方法。例如,如果我有数组

Object[] arr = {"mystring", new Boolean(false), new Integer(4), new Character('i')}

我用String的参数调用了这个方法(实际上我不确定我的参数的类型应该是什么),它会返回一个{"mystring"}的数组。

我尝试过像

这样的事情
public void printInstancesOf(Class c, Object[] array)
{
    for (Object obj : array)
    {
        if (obj instanceof c)
        {
             System.out.println(obj);
        }
    }
}

但这甚至都没有编译。有谁知道如何做到这一点?或者是不可能做到的?

4 个答案:

答案 0 :(得分:6)

看起来你想要Class.isInstance(Object o)

  

确定指定的Object是否与此Class表示的对象分配兼容。 此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException。否则返回false。

if (c.isInstance(obj) {
    System.out.println(obj);
}

答案 1 :(得分:2)

这不起作用,因为它正在测试objinstanceof文字c类。我没有方便的Java环境,但我相信像

这样的东西
if (obj.getClass().equals(c)) {

应该做的伎俩。这可能不适用于子类,但这不应该是一个问题。

编辑:正如其他人指出的那样

if (c.isInstance(obj)) {

是更好的选择

更大的问题是...... 你为什么要这样做?尝试模拟Java中的松散类型是一个令人钦佩的目标,但通常是一个非常糟糕的主意。使用适当的多态性和/或泛型(使用自定义类)。

答案 2 :(得分:1)

它看起来不像惯用的Java。您通常只为特定类构建数组,而不是混合不同的类,如String,Boolean,Integer,Character。

这通常是代码气味。

如果你有像

这样的层次结构

AFoo,BFoo,CFoo - >扩展Foo,并将它们放在一个数组中,你会让它们对一条消息做出显着反应:

for (Foo foo : foos) 
    foo.react (param); 
然后,AFoos可能会以不同于BFoos的方式做出反应。否则使用instanceof:

for (Foo foo : foos) 
    if (foo instanceof BFoo)
        barDoSomethingWith (foo, param);  

答案 3 :(得分:0)

你试过了吗?

private <E> List<E> findInstances(Class<E> type, Object[] arr) {
    List<E> instances = new ArrayList<E>();
    for(Object o : arr) {
        if(type.isInstance(o)) {
            instances.add((E)o);
        }
    }
    return instances;
}