2013-03-24 35 views
1

我想編寫一個簡單的代碼來使用java.util.LinkedList庫在Java中實現鏈接列表。我盡了最大的努力來保持它沒有錯誤。在java中編譯鏈接列表代碼時的警告

它使用-Xlint進行編譯(並執行):未選中。但它會產生很多類型的警告 - LL.java:25:警告:[未經檢查]未經檢查的呼叫添加(E)作爲原始類型的成員LinkedList

有人可以幫我 1.理解爲什麼它發生了嗎? 2.刪除警告!

任何幫助將不勝感激...

import java.util.LinkedList; 

class LL{ 
public static void main(String[] args){ 

    //creating a new linked list object 
    LinkedList LLobj = new LinkedList(); 

    //adding data to linked list 
    LLobj.add("T"); 
    LLobj.add("H"); 
    LLobj.add("I"); 
    LLobj.add("S"); 
    LLobj.add(" "); 
    LLobj.add("I"); 
    LLobj.add("S"); 
    LLobj.add(" "); 
    LLobj.add("A"); 
    LLobj.add(" "); 
    LLobj.add("L"); 
    LLobj.add("I"); 
    LLobj.add("N"); 
    LLobj.add("K"); 
    LLobj.add("E"); 
    LLobj.add("D"); 
    LLobj.add("-"); 
    LLobj.add("L"); 
    LLobj.add("I"); 
    LLobj.add("S"); 
    LLobj.add("T"); 

    //printing the linked list 
    System.out.println(LLobj); 

    //Implementing more functions to add data 
    LLobj.addFirst("#"); 
    LLobj.addLast("#"); 
    LLobj.add(5,"$"); 

    //printing the linked list 
    System.out.println(LLobj); 

    //removing data 
    LLobj.remove("$"); 
    LLobj.remove("#"); 
    LLobj.remove("#"); 

    //printing the linked list 
    System.out.println(LLobj); 
    } 
} 
+0

你得到的警告是什麼?我認爲你需要使用泛型類型,也許這就是警告。 – 2013-03-24 14:00:45

+0

您需要了解泛型。 – SLaks 2013-03-24 14:02:55

回答

5

那麼,您使用的是泛型類型(LinkedList<E>),但您將其用作原始類型,就好像您不知道泛型一樣。你想是這樣的:

LinkedList<String> list = new LinkedList<String>(); 

list.add("T"); 
list.add("H"); 

這樣,你在所涉及的類型而言是安全,你知道,一切都在列表中是一個字符串。

在Java 7,您可以使用"diamond syntax"推斷從左邊右邊類型:

LinkedList<String> list = new LinkedList<>(); 

對於更多的仿製藥(包括原料類型),請參閱Java generics FAQ。另請注意,在我的示例中,我如何將您的LLobj變量名稱(不遵循Java命名約定)重命名爲list。隨時遵守命名約定是個好主意,特別是在與其他人共享代碼時。

2

你只需要指定鏈表的類型,如下所示:

LinkedList<String> LLobj = new LinkedList<>(); 

這將告訴編譯器,只有String小號將被使用並且因此方法的安全性,因爲它們將僅接受String輸入(因爲Stringfinal類並且不能是extend編)。

+2

假設他正在使用Java 7。 – arshajii 2013-03-24 14:01:34

1

變化

LinkedList LLobj = new LinkedList(); 

LinkedList<String> LLobj = new LinkedList<String>(); 

這將解決所有這些類型的安全警告,因爲現在的編譯器會知道你是打算保持String S IN列表中。

1

給它一個類型

例如:

LinkedList<String> LLobj = new LinkedList<String>(); 
1

代碼:LinkedList LLobj = new LinkedList();必須LinkedList<String> LLobj = new LinkedList<String>();更換

編譯器會因爲你沒有在你的代碼,即類的使用泛型警告你您需要在列表中保留的對象。通過在你的代碼不使用泛型,您可以在列表就像輸入任何類型的對象:LLobj.add(new Integer(10)); LLobj.add("ABC");

這將導致拋出ClassCastException因爲你不知道哪個對象的類型會從列表中來它可以是一個字符串或整數。因此它會發出警告信息。 通過使用類似LinkedList<String> LLobj = new LinkedList<String>();的特定類型,您只能將String添加到您的列表中,因此在任何地方都不會出現ClassCastException