java – 对扩展存在的Enum类型的泛型感到困惑
问题1:我对这些代码感到有点困惑:
public class MyClass1 <E extends Enum<?>> { // ... } public class MyClass2 <E extends Enum<E>> { // ... } MyClass1和MyClass2有什么不同,这三种不同的E是什么意思? 问题2:从
但是不是所有Enum类型的常见基类Enum< E>? 问题3:现在我有这个课程: public class MyClass<E extends Enum<E>> { // for example,EnumSet<Category> public Set<E> category; // how to initial this member private Class<E> enumType; // initial this.category with given strings public void getEnumSetFromStringList(List<String> list) { this.category = EnumSet.noneOf(enumType); for (String str : list) { this.category.add(Enum.valueOf(this.enumType,str)); } } } // this is the Category of Enum type public enum Category { LOCATION("LOCATION"),HUMAN("HUMAN"),// ... DESCRIPTION("DESCRIPTION"); private final String categoryName; Category(String categoryName) { this.categoryName= categoryName; } } >我如何在MyClass中初始化数据字段enumType? 解决方法
Enum< E延伸Enum< E>>很难理解.
让我们考虑两个枚举. 枚举颜色{RED,GREEN,BLUE} 枚举形状{SQUARE,CIRCLE,TRIANGLE} 想想Enum中的compareTo()方法.这用于根据声明的顺序比较同一枚举中的不同常量.如果Enum不是泛型类,则此方法的签名必须是int compareTo(Enum e).但这没有任何意义,因为那时你可以将颜色与形状进行比较.我们希望Color中的compareTo签名为int compareTo(Color color).唯一的方法是,如果Enum是具有类型参数E的泛型类,并且Color的类型参数是Color!只要Color的类型参数是Color并且Shape的类型参数是Shape,那么我们只能将颜色与颜色和形状与形状进行比较. 所以在Enum的定义中,我们想要一些表达方式,对于每个子类,type参数不仅必须是枚举,而且type参数应该是子类本身.因此E不应该只扩展Enum,而E应该扩展Enum< E>! 这是Enum< E扩展Enum< E>>的地方.来自. (你不应该写Enum< E extends Enum<?>>). 为enumType分配值的一种方法是传递Class< E>.到构造函数.像这样 class MyClass2<E extends Enum<E>> { private final Class<E> enumType; MyClass2(Class<E> enumType) { this.enumType = enumType; } } 如果你不想这样做,另一种方法来获得Class< E>运行时的对象是使用Enum实例方法getDeclaringClass().这要求您手头有一个E实例来调用该方法.在运行时获取所有枚举常量数组的一种方法是编写e.getDeclaringClass().getEnumConstants(). 您不能编写E.class,因为正如您所说,泛型是使用类型擦除过程实现的.在运行时,ArrayList< String>只是一个ArrayList,因此无法访问type参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |