從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