簡體   English   中英

Instanceof不會顯示帶有接口的編譯錯誤,但是帶有抽象類會顯示

[英]Instanceof does not show compile error with interface, but with abstract class does

我認為標題是不言自明的。 因此,假設我有以下代碼:

interface A { }

abstract class B { }

class C { }

C c = new C();

System.out.println(c instanceof A); //fine
System.out.println(c instanceof B); // compile error

這個問題的評論中,我讀到:

編譯器永遠無法知道給定類型是否未實現接口,因為潛在的子類可以實現該接口。

因此,如果對於interface此方法有效,那么為什么它對abstract class不起作用? 它也應該由其他類進行擴展,因為它本身不能存在。 有人可以澄清嗎?

更新編譯消息:

錯誤:(22、28)Java:不兼容的類型:C無法轉換為B

很簡單:C擴展了Object。 C的任何子類都不能擴展B。您不能添加另一個基類,因為Java不支持多重繼承。

而C的子類可以很好地實現該附加接口。 但是根本無法將C對象也變成B實例。

所以:

D extends C implements B // obviously all fine

D extends B extends C 

是不可能的。 因為B 已經定義為除了Object之外擴展任何東西。 當然,這里的“技巧”是,類B,C都是已知的,並且如前所述:C不是擴展B。

舉個例子

class D extends C implements A{}

C c = new D();

編譯器可以立即告訴c永遠不能引用B的實例,因為如果類擴展了C那么它也不能擴展B 如以上示例所示,接口不能說相同。

那是因為在Java中創建抽象類的實例是絕對不可能的。 運算符instanceof是從Object類調用的,如果沒有撤銷它的類的實例(對象),則不能調用該運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM