为什么我的代码仍然有警告:warning: [unchecked] unchecked cast
?
当我使用'-Xlint'时,返回如下:
demo1.java:31: warning: [unchecked] unchecked cast
LinkedList<String> queueB = (LinkedList<String>)(queueA.clone());
^
required: LinkedList<String>
found: Object
1 warning
但我不明白。我使用'LinkedList'。 任何人都可以帮忙吗?
以下是我的代码。
import java.util.LinkedList;
import java.util.Iterator;
public class demo1
{
public static void main(String[] args)
{
LinkedList<String> queueA = new LinkedList<String>();
queueA.add("element 1");
queueA.add("element 2");
queueA.add("element 3");
Iterator<String> iterator = queueA.iterator();
while(iterator.hasNext())
{
String element = iterator.next();
}
for (Object object : queueA)
{
String element = (String) object;
System.out.println("queueA: "+element);
}
LinkedList<String> queueB = (LinkedList<String>)(queueA.clone());
System.out.println("queueB," + queueB.remove());
}
}
答案 0 :(得分:1)
您收到的是未经检查的投射警告,因为clone
returns an Object
而不是LinkedList<String>
。编译器只看到clone
返回Object
,因此转换为通用LinkedList<String>
将导致此警告。由于clone
丢失了任何类型信息,因此使用克隆无法在没有@SuppressWarnings
的情况下避免此警告。
然而,您可以使用the constructor that takes a Collection
作为参数创建新的LinkedList
。
LinkedList<String> queueB = new LinkedList<String>(queueA);
答案 1 :(得分:1)
归功于type erasure。编译后的代码实际上看起来像这样:
LinkedList<String> queueB = (LinkedList)(queueA.clone());
因此,不再保证类型安全。
答案 2 :(得分:0)
那是因为ClassCastException
有可能发生。编译器不确定以这种方式投射它是否安全。既然您事先知道它必须是LinkedList<String>
,您可以使用@SuppressWarnings
注释,但我建议不要进行未经检查的强制转换。