[英]Creating a LinkedList
如果我這樣創建一個LinkedList
:
LinkedList<Integer> Mistery = new LinkedList<>();
可以實現這一點: Mistery.getFirst();
另一方面,如果我創建這樣的LinkedList:
List<Integer> Mistery = new LinkedList<>();
在Mistery
列表上將無法實現getFirst()
方法。
為什么?
因為您將Mistery
聲明為超級類型: List
(盡管您選擇了LinkedList
作為實現),所以在List
接口中沒有定義getFirst()
方法。
List<Integer> Mistery = new LinkedList<>();
通過以這種方式聲明變量,您就是在告訴編譯器:我要使用List。 我想要的列表的實現是LinkedList,但是其余代碼不應該知道這一點。 它所需要知道的就是它是一個列表。 稍后我可能會改變主意並使用ArrayList,並且其余代碼仍將編譯,因為ArrayList也是一個List。 我還可以將另一個對象分配給相同的變量,並且該對象的類型可以是ArrayList或CopyOnWriteArrayList或任何其他類型的List。
由於List沒有getFirst()
方法,因此您無法使用它:變量的類型為List,而不是LinkedList。 在運行時,請確保該對象的類型為LinkedList。 但是編譯器只知道變量的類型。 它在運行時不知道其具體類型。
旁注:Java變量應以小寫字母開頭,以遵守標准約定。
還有一些要考慮的原因也是您為什么要使用List的原因。 (答案已經涵蓋了為什么List
沒有getFirst()方法)。
假設您有一種打印列表內容的方法:
public printStuff(List list){
for(Object element: list){
System.out.println(element);}
通過將您的Mistery列表聲明為List,這意味着您可以(通過polymorphism
)對列表范圍使用單一方法,即
List<Integer> Mistery = new LinkedList<>();
List<Integer> Mistery2 = new ArrayList<>();
List<String> Mistery3 = new ArrayList<>();
//etc
然后,您可以執行以下操作:
printStuff(Mistery);
printStuff(Mistery2);
printStuff(Mistery3); //can even print out a List which contains Strings
如果列表是這樣聲明的LinkedList<Integer> Mistery = new LinkedList<>();
您不能使用方法printStuff
。 您還應該閱讀有關鑄造的內容 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.