从Java 8中的错误是:
error: incompatible types: C cannot be converted to D
事实上,C
和D
不在同一血统(比均为Object
等)。由于编译器可以在编译时告诉您,instanceof
永远不会是真的,它确实如此。越早发现问题越好;编译器正在阻止你拥有不必要的代码或永远不会满足的条件。这就像您获得的代码永远无法到达的错误,因为逻辑是明确的,永远不允许执行代码(error: unreachable statement
)。
这里有一个完整的例子:
public class Example {
interface I { }
static class A { int x = 1;}
static class B extends A implements I { int y = 2;}
static class C extends B { }
static class D extends B{ }
static class E implements I { }
public static final void main(String[] args) {
C c2 = new C();
System.out.println(c2 instanceof D);
}
}
哪些失败:
Example.java:12: error: incompatible types: C cannot be converted to D
System.out.println(c2 instanceof D);
但是,如果你把它使编译器不能确切知道的是,instanceof
将永远是假的,那么它的确可以编译,并且在运行时得到false
:
public class Example {
interface I { }
static class A { int x = 1;}
static class B extends A implements I { int y = 2;}
static class C extends B { }
static class D extends B{ }
static class E implements I { }
public static final void main(String[] args) {
C c2 = new C();
doTheCheck(c2);
}
static void doTheCheck(Object o) {
System.out.println(o instanceof D);
}
}
因为我们正在检查的o
可能是任何东西,所以编译器不会提醒您不变的检查,代码编译,并且您得到false
作为输出。
尝试'的System.out.println( “” +(C2的instanceof d)); ' – EpicPandaForce 2014-09-11 11:10:18
'C'和'D'是具有相同继承层次的叶子,因此彼此不相关 - 在编译时可检查。 – Smutje 2014-09-11 11:11:13
谢谢。那么这是一个学校练习,我应该解释错误发生的原因。 – user3735871 2014-09-11 11:12:06