2014-11-04 72 views
0

爲什麼我的代碼仍然有警告:warning: [unchecked] unchecked cast? 當我使用「-Xlint」,返回的是這樣的:爲什麼我的代碼仍然有警告:`警告:[unchecked] unchecked cast`?

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()); 

    } 
} 

回答

1

你得到一個unchecked鑄警告,因爲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

這是由於type erasure。編譯的代碼實際上看起來像這樣:

LinkedList<String> queueB = (LinkedList)(queueA.clone()); 

因此,類型安全性不再保證。

0

那是因爲有機會發生ClassCastException。編譯器不確定它是否安全地以這種方式進行投射。既然您事先知道它必須是LinkedList<String>,您可以使用@SuppressWarnings註釋,但我建議不要執行未經檢查的轉換。

+0

從編譯器的角度來看,總會有'ClassCastException'的機會。只有程序員可以知道(或相信)演員永遠不會失敗。這不是一個正確的答案。 – Dici 2014-11-04 00:22:16

相關問題