您需要对泛型辅助方法使用未经检查的演员表:
private static <T extends Enum<T> & Marshallable> void fooHelper(Class<? extends Marshallable> type) { if (type.isEnum()) { //This is safe because of the isEnum check, and we don't return any //type with T (important because the caller can specify what T is). @SuppressWarnings("unchecked") final Class<T> enumType = (Class<T>)type; final List<T> enumConstants = Arrays.asList(enumType.getEnumConstants()); foo(enumConstants); }}您的版本不工作的原因是因为
T extends Enum<T> & Marshallable,
T递归的约束-
这只能与类型的参数来表示。中的通配符类型参数
? extends Enum<? extends Marshallable>不再指定该关系。
警告: 务必
fooHelper不要返回包含的类型,
T因为这可能导致堆污染。例如:
private static <T extends Enum<T> & Marshallable> List<T> unsafeFooHelper(Class<? extends Marshallable> type) { if (type.isEnum()) { //no longer safe! @SuppressWarnings("unchecked") final Class<T> enumType = (Class<T>)type; return Arrays.asList(enumType.getEnumConstants()); } return Collections.emptyList();}enum Enum1 implements Marshallable { ONE, TWO }enum Enum2 implements Marshallable { A, B }...//caller lies about what T is:List<Enum2> enumConstants = Main.<Enum2>unsafeFooHelper(Enum1.class);//sometime later...Enum2 enumConstant = enumConstants.get(0); //ClassCastException


