我有一个程序,我需要在数组中查找类的所有实例。我想创建一个为我做这个的方法。例如,如果我有数组
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);
}
}
}
但这甚至都没有编译。有谁知道如何做到这一点?或者是不可能做到的?
答案 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)
这不起作用,因为它正在测试obj
是instanceof
文字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;
}