为什么我的代码仍然有警告:`warning:[unchecked] unchecked cast`?

时间:2014-11-04 00:14:52

标签: java

为什么我的代码仍然有警告: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());

    }
}

3 个答案:

答案 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注释,但我建议不要进行未经检查的强制转换。

相关问题