在java中编译链接列表代码时的警告

时间:2013-03-24 13:58:54

标签: java list compiler-construction linked-list warnings

我正在尝试编写一个简单的代码,使用java.util.LinkedList库在Java中实现Linked List。我尽力保持它没有错误。

它使用-Xlint编译(并执行):unchecked。但是它产生了很多类型的警告--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);
    }
}

5 个答案:

答案 0 :(得分:5)

嗯,您使用的是通用类型(LinkedList<E>),但您将其用作 raw 类型,就像您不了解泛型一样。你想要这样的东西:

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。最好始终遵循命名约定,尤其是在与其他人共享代码时。

答案 1 :(得分:2)

您只需指定链表的类型,如下所示:

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

这将告诉编译器仅使用String因此.add()方法的安全性,因为它们只接受String输入(String是一个final类,不能extend编辑。

答案 2 :(得分:1)

更改

LinkedList LLobj = new LinkedList();

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

这将解决所有这些类型安全警告,因为现在编译器将知道您打算将String保留在列表中。

答案 3 :(得分:1)

给它一个类型

示例:

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

答案 4 :(得分:1)

代码:LinkedList LLobj = new LinkedList();必须替换为LinkedList<String> LLobj = new LinkedList<String>();

编译器会警告您,因为您的代码中没有使用泛型,即您需要在列表中保存的对象类型。通过在代码中不使用泛型,您可以在列表中输入任何类型的对象,如:LLobj.add(new Integer(10)); LLobj.add("ABC");

这将导致ClassCastException ,因为您不知道哪个类型的对象将来自列表它可以是String或Integer。因此它给出了警告信息。 通过使用LinkedList<String> LLobj = new LinkedList<String>();等特定类型,您只能将String添加到列表中,因此没有ClassCastException 将在任何地方出现。