Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数组中查找给定类的所有实例_Java - Fatal编程技术网

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

Java 在数组中查找给定类的所有实例,java,Java,我有一个程序,需要在数组中查找类的所有实例。我想创建一个方法,为我做到这一点。例如,如果我有数组 Object[] arr = {"mystring", new Boolean(false), new Integer(4), new Character('i')} 我用String参数调用了这个方法(实际上我不确定参数的类型),它将返回一个{“mystring”}数组 我试过这样的方法 public void printInstancesOf(Class c, Object[] array)

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

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

但这甚至不能编译。有人知道怎么做吗?或者不可能吗?

这不起作用,因为它正在测试
obj
是否是
文本
c
类的
实例。我手头没有Java环境,但我相信

if (obj.getClass().equals(c)) {
我们应该做到这一点。这可能不适用于子类,但这不应该是一个问题

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

if (c.isInstance(obj)) {
是更好的选择吗

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

看起来像是您想要的:

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

您是否尝试过:

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;
}
私有列表查找实例(类类型,对象[]arr){
列表实例=新的ArrayList();
用于(对象o:arr){
if(类型isInstance(o)){
增加((E)o);
}
}
返回实例;
}

它看起来不像惯用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);  

您希望如何处理这些实例?只是打印它们?或者,您可以使用
try{c.cast(obj);System.out.println(obj);}catch(ClassCastException e){}
for (Foo foo : foos) 
    if (foo instanceof BFoo)
        barDoSomethingWith (foo, param);