我正在尝试使用 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);
}
}
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
。始终遵循命名约定是个好主意,尤其是在与他人共享代码时。LinkedList<String> LLobj = new LinkedList<>();
这将告诉编译器仅使用
String
,因此
.add()
方法的安全性,因为它们仅接受 String
输入(因为 String
是 final
类,不能是 extend
编辑)。LinkedList LLobj = new LinkedList();
到
LinkedList<String> LLobj = new LinkedList<String>();
这将解决所有这些类型安全警告,因为现在编译器将知道您打算将
String
保留在列表中。
示例:
LinkedList<String> LLobj = new LinkedList<String>();
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。