Java instanceof何时返回FALSE?
我知道当对象是特定类的实例时,instanceof返回TRUE。例如:Java instanceof何时返回FALSE?,java,instanceof,Java,Instanceof,我知道当对象是特定类的实例时,instanceof返回TRUE。例如: B extends A C extends A B b = new B(); C c = new C(); b instanceof A // returns TRUE 到目前为止还不错,让我们输入一些看起来应该返回false的内容: c instanceof B // won't compile (error: inconvertible types) 这不会编译,这是有意义的,因为它允许在编译时捕获疏忽。但是,i
B extends A
C extends A
B b = new B();
C c = new C();
b instanceof A // returns TRUE
到目前为止还不错,让我们输入一些看起来应该返回false的内容:
c instanceof B // won't compile (error: inconvertible types)
这不会编译,这是有意义的,因为它允许在编译时捕获疏忽。但是,instanceof何时实际返回false?看来只有两个选择是正确的和错误的。我能想到的唯一例外是:
null instanceof A // returns FALSE
但是,按照与上面相同的逻辑,这似乎也应该在编译时捕获
我错过了什么?true/error是唯一实用的选项吗?或者,除了将null作为参考变量外,是否有可能以更有意义的方式返回false?下面是一个计算结果为false的示例:
class A {}
class B extends A {}
A a = new A();
a instanceof B // false
现场演示:。下面是另一个返回false的示例
public static void main(String[] args) {
checkType("");
}
static <T> void checkType(T sometype) {
System.out.println(sometype instanceof A);
}
static class A {}
没有意义,因为类型
C
不在A
的继承层次结构中,除了其他答案:任何时候,左边的表达式或右边的类型是接口,那么instanceof
可能为真,因此编译器必须允许它。因此,很容易找到错误的例子
B extends A
C extends A
B b = new B();
C c = new C();
b instanceof A // returns TRUE
myMethod(b); // has TRUE and then FALSE
myMethod(c); // has FALSE and then TRUE
void myMethod(A a){
if(a instanceof B){System.out.println("This is a B");}//first statement
if(a instanceof C){System.out.println("This is a C");}//second statement
}
在调用
myMethod(b)
时,此方法的第二个语句中的if求值将为FALSE,并将打印这是一个b。但是在调用myMethod(c)
时,此方法的第一个语句中的if求值将为FALSE,并将打印这是一个c,即safaris拼写检查器。考虑上面的伪代码。将编译B的(对象)c实例的可能副本。B
的c实例未编译的原因是编译器可以静态地确定对ac
的引用永远不能是aB
。
B extends A
C extends A
B b = new B();
C c = new C();
b instanceof A // returns TRUE
myMethod(b); // has TRUE and then FALSE
myMethod(c); // has FALSE and then TRUE
void myMethod(A a){
if(a instanceof B){System.out.println("This is a B");}//first statement
if(a instanceof C){System.out.println("This is a C");}//second statement
}