
public class Test {
public static void main(String[] args) {
List<A> aList = new ArrayList<>();
A a = new A();
System.out.println(aList instanceof A); // 編譯能通過?
System.out.println(aList instanceof List<B>); // 編譯不能通過?
System.out.println(aList instanceof List<A>); // 編譯不能通過?
System.out.println(a instanceof List<?>); // 編譯能通過?
System.out.println(a instanceof List); // 編譯能通過?
// A 和 List 不在同一個繼承樹,為什么能夠通過編譯?
}
}
class A {
}
class B {
}
1.A 與List沒有繼承關系,為什么編譯能通過?
2.aList instanceof List<A> 為什么編譯不通過?
uj5u.com熱心網友回復:
https://www.cnblogs.com/lzq198754/p/5780426.html編譯不通過原因,泛型擦除機制,所以報錯
編譯通過原因,為什么不通過呢,這又不是assert, 不會產生報錯,只產生結果true or false。instanceof只進行判斷相當于.equals在最低端實作了
uj5u.com熱心網友回復:
List<A> aList = new ArrayList<>();A a = new A();
B b = new B();
System.out.println(b instanceof A); // A和B沒有繼承關系,所以編譯不通過
System.out.println(aList instanceof A); // List 和 A也沒有繼承關系, 為什么能通過?
uj5u.com熱心網友回復:
能再解釋一下嗎
List<A> aList = new ArrayList<>();
A a = new A();
B b = new B();
System.out.println(b instanceof A); // A和B沒有繼承關系,所以編譯不通過
System.out.println(aList instanceof A); // List 和 A也沒有繼承關系, 為什么能通過?
uj5u.com熱心網友回復:
看看instanceof 自己百度,和別的弄混了吧,不會編譯不通過的,最多報false,沒有繼承關系就運行階段輸出false,怎么可能編譯階段出錯。uj5u.com熱心網友回復:
樓上說的正確
舉個例子來說
List<A> aList = new ArrayList<>();
List<B> bList = new ArrayList<>();
System.out.println(aList.getClass());//輸出 class java.util.ArrayList
System.out.println(aList.getClass() == bList.getClass());//輸出:true
所以aList instanceof List<A>這里List<A>沒有意義,被認為是語法錯誤。
uj5u.com熱心網友回復:
你可以復制代碼自己看看,instanceof 的內容我百度過,找了很多沒有找到我說的這個問題
uj5u.com熱心網友回復:
boolean result = obj instanceof Class
注意:編譯器會檢查 obj 是否能轉換成右邊的class型別,如果不能轉換則直接報錯,如果不能確定型別,則通過編譯,具體看運行時定。
List是泛用型無法判斷型別所以通過編譯。
uj5u.com熱心網友回復:
instanceof 不是用來檢測實體是不是屬于類的嗎,和是不是繼承貌似沒關系吧uj5u.com熱心網友回復:
首先建議你先去看看instanceof的用法,A instanceof B,A是不是B型別,注意是型別,不是實體轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24203.html
標籤:Java SE
