2014-11-04 1 views
0

내 코드에 여전히 경고 : 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()); 

    } 
} 

답변

1

당신은 검사되지 않은 캐스트 경고 때문에 clone returns an Object 아닌 LinkedList<String>을 얻고있다. 컴파일러에서는 cloneObject을 반환하기 때문에 일반 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

관련 문제