java – 对扩展存在的Enum类型的泛型感到困惑
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 对扩展存在的Enum类型的泛型感到困惑,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2517字,纯文字阅读大概需要4分钟。
内容图文
问题1:我对这些代码感到有点困惑:
public class MyClass1 <E extends Enum<?>> {
// ...
}
public class MyClass2 <E extends Enum<E>> {
// ...
}
MyClass1和MyClass2有什么不同,这三种不同的E是什么意思?
问题2:从Class Enum <E extends Enum<E>>开始
This is the common base class of all Java language enumeration types.
但是不是所有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?
>如果MyClass不包含数据字段enumType,那么函数getEnumSetFromStringList(List< String> list)如何获得泛型类型的类型< E extends Enum<?>>?
>我可以用这种方式获得Enum类型:E.class?如果没有,是否在编译期间从泛型类型擦除的原因?
解决方法:
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参数.
内容总结
以上是互联网集市为您收集整理的java – 对扩展存在的Enum类型的泛型感到困惑全部内容,希望文章能够帮你解决java – 对扩展存在的Enum类型的泛型感到困惑所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。