我有一个对象堆栈,在这个堆栈中我推送 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不起作用时,它无法再区分ClassA和ClassB
Object o = method(s);
if ( o instanceof ClassA){
//do something
} else if (o instanceof ClassB) {
//do something else
}
内部方法(Stack s)instanceof有效,外部无效,但toString()方法工作正常,它为每个类返回正确的字符串。
最佳答案
在某些情况下,您的内省(introspection)代码可能无法按您的预期工作:
如果
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/