2010-12-18 3 views
2

Java 프로그램에서 List<? extends SomeBaseClass>의 객체를 List<SomeBaseClass>으로 형변환해야합니다. 만약 내가 직접 캐스팅하면 컴파일러는 체크되지 않은 캐스트가 있다는 경고 (경고 표시)를합니다. 모든 객체가 수퍼 클래스로 변환 될 수 있다고 확신해도 컴파일러는이를 인식하지 않고 검사되지 않은 캐스트를보고합니다. 어떻게 경고를 없앨 수 있습니까? @SupressWarnings ("선택 취소") 이외의 다른 방법이 있습니까?수퍼 클래스 목록으로 캐스팅 할 때 Java에서 검사되지 않은 캐스트

피씨 : 코드가 정상적으로 작동합니다. 일을하는 더 좋은 방법이 있는지 궁금합니다.

편집 :

솔루션 : 그는 그가 미래의 목록을 변경하지 않습니다 확신 경우 하나는 캐스트의이 유형을해야한다. 그러나 개별 개체를 목록에서 제거 할 때 개별 개체를 캐스팅하는 것이 좋습니다.

+1

일반적으로 와일드 카드 유형을 반환하지 않으면 이러한 변환의 필요성을 줄일 수 있습니다. 와일드 카드 유형을 인수로 취하는 메서드 내에서 와일드 카드 (반복기 변수 등)를 반복해야하는 곳이 거의 없어야하며 거기에서 실제로 와일드 카드를 반복하므로 실수로 목록에 추가하지 않습니다. 알 수없는 하위 유형. –

답변

7

컴파일러는 불평이 간단한 예를 생각해 보자. 다음 예에서

당신의 SomeBaseClassNumber 수치는 때

List<? extends Number> doubles = new ArrayList<Double>(); 
List<Number> nums = (List<Number>) doubles; 

nums.add(new Integer(5)); // no compiler complaints here... 

// doubles now contains an Integer value! 

귀하의 경우이 주위에 방법이없는 경우, 나는 @SuppressWarnings("unchecked") 여기에 당신의 최선의 선택 믿습니다.

+0

대단히 고맙습니다. 이제 잘못 될 수있는 부분을 알게되었습니다. 문제를 해결하는 방법도 알고 있습니다. 목록을 사용하여 걷기 만 했으므로 아무 것도 추가하지 않았으므로 원래 유형의 컬렉션을 유지할 수 있습니다. iteration과 같은 모든 것들 : for (Number n : double) – k21

-1

당신은 추락하고 있습니다. 이것은 나쁜 습관입니다. 이 캐스팅을 피하기 위해 코드를 리팩터링하십시오. 물론이 경우 경고를 표시해서는 안됩니다.

1

당신이하려는 것은 안전하지 않습니다. 당신이 당신의 List<SomeBaseClass> 목록 유형 SomeBaseClass의 객체를 추가하는 경우, 당신은 당신의 List<? extends SomeBaseClass> 목록의 내용을 "위반"수 있기 때문에

import java.util.*; 

class SomeBaseClass 
{ 
} 

class SomeSubClass extends SomeBaseClass 
{ 
    public static void main(String[] a) 
    { 
     List<SomeSubClass> orig = new ArrayList<SomeSubClass>(); 
     // Compiles with no warnings. This is the purpose of the ? extends syntax 
     List<? extends SomeBaseClass> l1 = orig; 
     // This is what you're trying to do 
     List<SomeBaseClass> l2 = (List<SomeBaseClass>) l1; 
     // Then, we add a SomeBaseClass to the new list 
     l2.add(new SomeBaseClass()); 
     // ClassCastException, since this casts a SomeBaseClass to a SomeSubClass 
     SomeSubClass first = orig.get(0); 
    } 
} 
관련 문제