簡體   English   中英

創建一個LinkedList

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

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