Java枚举很棒.仿制药也是如此.当然,由于类型擦除,我们都知道后者的局限性.但有一件事我不明白,为什么我不能创建这样的枚举:

public enum MyEnum<T> {
    LITERAL1<String>,
    LITERAL2<Integer>,
    LITERAL3<Object>;
}

然后,该通用类型参数<T>又可以在各个地方有用.设想一个方法的泛型类型参数:

public <T> T getValue(MyEnum<T> param);

甚至在enum类本身中:

public T convert(Object o);

更具体的例子#1

因为上面的例子对一些人来说可能太抽象了,所以这里有一个更真实的例子来说明我为什么要这么做.在这个例子中,我想使用

  • 枚举,因为这样我可以枚举一组有限的属性键
  • 泛型,因为这样我就可以拥有存储属性的方法级类型安全
public interface MyProperties {
     public <T> void put(MyEnum<T> key, T value);
     public <T> T get(MyEnum<T> key);
}

更具体的例子#2

我列举了一些数据类型:

public interface DataType<T> {}

public enum SQLDataType<T> implements DataType<T> {
    TINYINT<Byte>,
    SMALLINT<Short>,
    INT<Integer>,
    BIGINT<Long>,
    CLOB<String>,
    VARCHAR<String>,
    ...
}

每个枚举文本显然都有基于泛型类型<T>的附加属性,同时也是一个枚举(不可变、单例、可枚举等)

问题:

难道没人想到这一点吗?这是与编译器相关的限制吗?考虑到关键字"enum"被实现为语法糖,向JVM表示生成的代码,我不理解这个限制.

谁能解释给我听?在回答之前,考虑一下:

  • 我知道泛型类型会被删除:-)
  • 我知道有一些使用类对象的变通方法.它们是变通办法.
  • 泛型类型在适用的任何地方(例如,在调用Convert()方法时)都会导致编译器生成的类型强制转换
  • 泛型&lt;T&gt;会在枚举表上.因此,它由每个枚举的文本绑定.因此,编译器将知道在编写类似于String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);的代码时应用哪种类型
  • 这同样适用于T getvalue()方法中的泛型类型参数.编译器可以在调用String string = someClass.getValue(LITERAL1)时应用类型转换

推荐答案

这件事在JEP-301 Enhanced Enums年前就已经讨论过了,遗憾的是,它被撤回了.JEP中给出的例子正是我想要的:

enum Argument<X> { // declares generic enum
   STRING<String>(String.class), 
   INTEGER<Integer>(Integer.class), ... ;

   Class<X> clazz;

   Argument(Class<X> clazz) { this.clazz = clazz; }

   Class<X> getClazz() { return clazz; }
}

Class<String> cs = Argument.STRING.getClazz(); //uses sharper typing of enum constant

不幸的是,JEP正在与无法解决的重大问题作斗争:http://mail.openjdk.java.net/pipermail/amber-spec-experts/2017-May/000041.html

Java相关问答推荐

在数组中使用意想不到的结果

java.lang. StackOverFlow错误:显示表及其依赖项时为空

将@ManyToOne JPA Composite Key用作Id保存实体添加额外参数

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

具有默认分支的JUnit代码覆盖率切换声明

Java JAR环境(JRE)是否支持模块?

如何调整工作时间日历中的时间

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

格式中的特定回录键-值对

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

Kotlin Val是否提供了与Java最终版相同的可见性保证?

允许同时执行两个方法,但不能同时执行这两个方法

是否在settings.xml中使用条件Maven镜像?

Android应用程序为错误的显示类型 Select 尺寸文件

如何使用MapStrCut转换双向链接

在Java中将对象&转换为&q;HashMap(&Q)

无法在IntStream上应用Collectors.groupingBy

为什么我的登录终结点不能被任何请求访问?

转换为JSON字符串时,日期按天递减-Java