2

我有一个程序,我需要在一个数组中找到一个类的所有实例。我想创建一个为我执行此操作的方法。例如,如果我有数组

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

4 回答 4

6

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

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

if (c.isInstance(obj) {
    System.out.println(obj);
}
于 2012-06-20T03:27:53.013 回答
2

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

if (obj.getClass().equals(c)) {

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

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

if (c.isInstance(obj)) {

是更好的选择

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

于 2012-06-20T03:26:14.283 回答
1

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

这通常是代码异味。

如果你有一个像

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

for (Foo foo : foos) 
    foo.react (param); 

然后 AFoos 可以以不同于 BFoos 的方式做出反应。否则使用实例:

for (Foo foo : foos) 
    if (foo instanceof BFoo)
        barDoSomethingWith (foo, param);  
于 2012-06-20T11:50:56.347 回答
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;
}
于 2012-06-20T03:31:13.907 回答