Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java instanceof何时返回FALSE?_Java_Instanceof - Fatal编程技术网

Java instanceof何时返回FALSE?

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

我知道当对象是特定类的实例时,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)
这不会编译,这是有意义的,因为它允许在编译时捕获疏忽。但是,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实例未编译的原因是编译器可以静态地确定对a
c
的引用永远不能是a
B
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
}