我正在尝试编写一个简单的代码,使用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);
}
}
答案 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 将在任何地方出现。