加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 对扩展存在的Enum类型的泛型感到困惑

发布时间:2020-12-15 04:24:27 所属栏目:Java 来源:网络整理
导读:问题1:我对这些代码感到有点困惑: public class MyClass1 E extends Enum? { // ...}public class MyClass2 E extends EnumE { // ... } MyClass1和MyClass2有什么不同,这三种不同的E是什么意思? 问题2:从 Class Enum E extends EnumE 开始 This is the
问题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参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读