클래스 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);
}
참고 :
단순히 캐스트를 제거하십시오. 템플릿 매개 변수는 원시 형식의 Object로 대체됩니다. – talex
[EnumSet.allOf] (https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html#allOf%28java.lang.Class%29)를 사용해 보셨습니까? – OldCurmudgeon
아마도 [typetools] (http://search.maven.org/#artifactdetails%7Cnet.jodah%7Ctypetools%7C0.3.1%7Cjar) 라이브러리를 사용하여 액세스 할 수 있습니다. – bhdrkn