[英]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.