相关疑难解决方法(0)

为什么Java枚举文字不能具有泛型类型参数?

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

public enum MyEnum<T> {
    LITERAL1<String>,
    LITERAL2<Integer>,
    LITERAL3<Object>;
}
Run Code Online (Sandbox Code Playgroud)

这个泛型类型参数<T>反过来可以在各个地方使用.想象一下方法的泛型类型参数:

public <T> T getValue(MyEnum<T> param);
Run Code Online (Sandbox Code Playgroud)

甚至在枚举类中:

public T convert(Object o);
Run Code Online (Sandbox Code Playgroud)

更具体的例子#1

由于上面的例子对某些人来说可能看起来过于抽象,所以这里有一个更真实的例子,说明我为什么要这样做.在这个例子中我想使用

  • 枚举,因为那时我可以枚举一组有限的属性键
  • 泛型,因为那时我可以使用方法级类型安全来存储属性
public interface MyProperties {
     public <T> void put(MyEnum<T> key, T value);
     public <T> T get(MyEnum<T> key);
}
Run Code Online (Sandbox Code Playgroud)

更具体的例子#2

我有一个数据类型的枚举:

public interface DataType<T> {}

public enum SQLDataType<T> implements DataType<T> {
    TINYINT<Byte>,
    SMALLINT<Short>,
    INT<Integer>,
    BIGINT<Long>,
    CLOB<String>,
    VARCHAR<String>,
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

题:

没有人想到这个吗?这是与编译器相关的限制吗?考虑到事实,关键字" 枚举 "是作为语法糖实现的,表示生成的代码到JVM,我不明白这个限制.

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

  • 我知道泛型类型被删除了:-)
  • 我知道有使用Class对象的变通方法.他们是变通办法.
  • 在适用的情况下,通用类型会导致编译器生成的类型转换(例如,在调用convert()方法时
  • 泛型类型<T>将在枚举上.因此它受每个枚举文字的约束.因此编译器会知道,在编写类似的东西时要应用哪种类型String string = LITERAL1.convert(myObject); Integer …

java generics enums

139
推荐指数
4
解决办法
2万
查看次数

标签 统计

enums ×1

generics ×1

java ×1