2014-12-05 3 views
0

클래스 EnumSet<E extends Enum<E>>에는 public void include(E e) 메서드가 있으며이 메서드는 열거 형 상수를 가져와 해당 열거 형 집합을 나타내는 목록에 넣습니다.Java의 generic 매개 변수로 캐스팅

이제 XML 파일에서 EnumSets을 리플렉션을 통해로드하려고합니다. 따라서 열거 형 상수를 반복하여로드 된 세트에 포함 할 수 있습니다.

Object[] enum_const = Class.forName(cur.getAttributeValue("type")).getEnumConstants(); 
field.set(obj, Class.forName(cur.getAttributeValue("type")).newInstance()); 
for (Object o : enum_const) { 
    if (o.toString().equalsIgnoreCase(cur.getText())) { 
     ((EnumSet<?>) field.get(obj)).include((E) o); 
     // Include each matching EnumConstant.. 
    } 
} 

E가 해당 컨텍스트에서 액세스 할 수 없기 때문에 마지막 캐스트를 수행 할 수 없습니다. 누구든지이 문제에 대한 해결책을 가지고 있습니까? 여기에서 만들어지는이 체크되지 않은 캐스트, 세트에 대한 하나 요소의 하나가 있다는 것을

@SuppressWarnings("unchecked") 
static <E extends Enum<E>> void uncheckedInclude(EnumSet<?> enumSet, Object element) { 
    EnumSet<E> enumSetWithNarrowedType = (EnumSet<E>) enumSet; 
    E elementWithNarrowedType = (E) element; 
    enumSetWithNarrowedType.include(elementWithNarrowedType); 
} 

... 

if (o.toString().equalsIgnoreCase(cur.getText())) { 
    uncheckedInclude((EnumSet<?>) field.get(obj), o); 
} 

참고 :

+0

단순히 캐스트를 제거하십시오. 템플릿 매개 변수는 원시 형식의 Object로 대체됩니다. – talex

+0

[EnumSet.allOf] (https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html#allOf%28java.lang.Class%29)를 사용해 보셨습니까? – OldCurmudgeon

+0

아마도 [typetools] (http://search.maven.org/#artifactdetails%7Cnet.jodah%7Ctypetools%7C0.3.1%7Cjar) 라이브러리를 사용하여 액세스 할 수 있습니다. – bhdrkn

답변

0

당신은 일반적인 도우미 메서드를 사용할 수 있습니다. 일반 와일드 카드가 재귀 E extends EnumSet<E> 바인딩을 나타낼 수 없으므로 EnumSet<?>에서 EnumSet<E>의 캐스트가 필요합니다.

분명히 @SuppressWarnings("unchecked")은 유형이 정확할 것으로 기대하고 있습니다. JVM조차 잘못 검사되지 않은 캐스트에 대해 빠르게 실패 할 수 없으므로 문서를 잘 작성하고 도우미 메소드가 남용되지 않도록해야합니다.

관련 문제