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

问题描述 投票:0回答:5

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

它确实使用 -Xlint:unchecked 进行编译(并执行)。但它会生成大量类型的警告 - LL.java:25: warning: [unchecked] unchecked call to add(E) as a member of the 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);
    }
}
java list linked-list warnings
5个回答
8
投票

嗯,您正在使用泛型类型 (

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

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

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

这样,就涉及的类型而言,您是“安全”的,并且您知道列表中的所有内容都是字符串。 在 Java 7 中,您可以使用

“菱形语法”

从左侧推断右侧的类型: LinkedList<String> list = new LinkedList<>();

有关泛型(包括原始类型)的
更多

更多信息,请参阅Java泛型常见问题解答。另请注意,在我的示例中,我如何将您的 LLobj 变量名称(不遵循 Java 命名约定)重命名为

list
。始终遵循命名约定是个好主意,尤其是在与他人共享代码时。
    


2
投票

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

这将告诉编译器仅使用 
String

,因此

.add()
方法的安全性,因为它们仅接受
String
输入(因为
String
final
类,不能是
 extend
编辑)。
    


1
投票

LinkedList LLobj = new LinkedList();

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

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

保留在列表中。

    


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

© www.soinside.com 2019 - 2024. All rights reserved.