2013-03-24 71 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