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