enum Search { HITHER , YON } public class UpCastEnum { public static void main(String[] args) { Search[] vals = Search.values() ; Enum e = Search.HITHER ; for(Enum en : e.getClass().getEnumConstants()) { } /* 如果改写成这样就会报错 Class> clazz = e.getClass() ; for(Enum en : clazz.getEnumConstants()) { } */ } }
一开始我以为是编译器的自动优化, 于是将jdk版本从1.8降回了1.6, 发现未注释的代码仍然编译正确, 这个是怎么回事呢? 一样是无界通配符, 只是添加了中间变量, 产生的结果却不同呢?
这个就没问题
Class<? extends Enum> clazz = e.getClass();
for (Enum en: clazz.getEnumConstants()) {
}
如果指定了 <? extends Enum>
,由 Class<T>
中定义的 T[] getEnumConstants()
可以明确返回值是 T
类型的,上例就是 Enum
。如果没指定,就是 Object
类型的,所以可以
Class<?> clazz = e.getClass();
for (Object en: clazz.getEnumConstants()) {
}
// 或者
for (Enum en: (Enum[]) clazz.getEnumContaint()) {
}