我有一堆对象,在此堆栈中,我推送了ClassA和ClassB对象。
我有一个必须从该堆栈返回对象的方法
public Object method(Stack s){
ClassA a = new ClassA();
stack.push(a);
ClassB b = new ClassB();
stack.push(b);
while(stack has two elements) stack.pop();
return stack.pop()// I return the last element
}
问题是:当我调用此方法instanceof不起作用时,它无法再从ClassB告诉ClassA
Object o = method(s);
if ( o instanceof ClassA){
//do something
} else if (o instanceof ClassB) {
//do something else
}
内部方法(Stack的)instanceof可以工作,外部方法不可以,但是toString()方法可以正常工作,它为每个类返回正确的String。
最佳答案
在某些情况下,自省代码可能无法按预期工作:
如果o
是null
,则instanceof
运算符将返回false
。根据JLS,null
值不是任何类型的实例。
如果ClassB
是classA
的子类型,则o instanceof ClassA
将为true
的实例返回ClassB
。
如果使用类加载器进行复杂的操作,则可以使用不同的类加载器加载相同的“ .class”文件。如果这样做,将遇到类的两个“副本”实际上具有不同类型的问题,并且instanceof
将返回false
。 (此行为也在JLS中指定。)
最后一种情况可能会特别令人困惑,因为当您查看两个类的名称时,它们将是相同的。但是class1.equals(class2)
或class1 == class2
将为您提供有关两个类实际上是否相同的明确答案。
关于java - Java自省(introspection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13100590/