1

我正在尝试编写一个简单的代码来使用 java.util.LinkedList 库在 Java 中实现链接列表。我已尽力保持它没有错误。

它确实使用 -Xlint:unchecked 编译(和执行)。但它会生成很多类型的警告 - LL.java:25: warning: [unchecked] unchecked call to add(E) as a member of raw type 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);
    }
}
4

5 回答 5

8

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

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

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

这样,就所涉及的类型而言,您是安全的,并且您知道列表中的所有内容都是字符串。

在 Java 7 中,您可以使用“菱形语法”从左侧推断右侧的类型:

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

有关泛型(包括原始类型)的更多信息,请参阅Java 泛型常见问题解答。另请注意,在我的示例中,我如何将您的LLobj变量名(不遵循 Java 命名约定)重命名为list. 始终遵循命名约定是个好主意,尤其是在与他人共享代码时。

于 2013-03-24T14:01:03.537 回答
2

你只需要指定链表的类型,如下:

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

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

于 2013-03-24T14:01:03.067 回答
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 。

于 2013-03-24T14:03:33.883 回答
1

改变

LinkedList LLobj = new LinkedList();

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

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

于 2013-03-24T14:01:16.610 回答
1

给它一个类型

例子:

LinkedList<String> LLobj = new LinkedList<String>();
于 2013-03-24T14:01:44.040 回答