相关文章推荐
一身肌肉的莲藕  ·  java 枚举(enum) 全面解读开发者社区·  1 月前    · 
茫然的键盘  ·  java反射创建枚举对象_mob64ca12 ...·  1 月前    · 
自信的数据线  ·  枚举的底层原理是什么?-阿里云开发者社区·  1 月前    · 
俊秀的葫芦  ·  记者手记:埃塞俄比亚,后会有期!--国际--人民网·  1 年前    · 
含蓄的大海  ·  jQuery Ajax请求执行得太频繁·  1 年前    · 
谦虚好学的钥匙  ·  如何使用sed只删除双空行?·  1 年前    · 
无邪的四季豆  ·  kibana上管理es索引的生命周期,自动删 ...·  1 年前    · 
狂野的马克杯  ·  RDweb 2019 Server - ...·  1 年前    · 
Code  ›  为什么Java enum文本不能具有泛型类型参数?开发者社区
object 泛型 enum 枚举类型
https://cloud.tencent.com/developer/ask/sof/49747/answer/102411513
酷酷的作业本
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 为什么Java enum文本不能具有泛型类型参数?

Stack Overflow用户
提问于 2010-11-27 17:12:05
EN

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

代码语言: javascript
复制
public enum MyEnum<T> {
    LITERAL1<String>,
    LITERAL2<Integer>,
    LITERAL3<Object>;
}

这样,这个泛型类型参数 <T> 就可以在不同的地方发挥作用。想象一下一个方法的泛型类型参数:

代码语言: javascript
复制
public <T> T getValue(MyEnum<T> param);

或者甚至在枚举类本身中:

代码语言: javascript
复制
public T convert(Object o);

更具体的例子#1

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

  • 枚举,因为这样我就可以枚举
  • 泛型的属性键的有限集合,因为这样我就可以拥有用于存储属性的方法级类型安全

代码语言: javascript
复制
public interface MyProperties {
     public <T> void put(MyEnum<T> key, T value);
     public <T> T get(MyEnum<T> key);
}

更具体的例子#2

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

代码语言: javascript
复制
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
    TINYINT<Byte>,
    SMALLINT<Short>,
    INT<Integer>,
    BIGINT<Long>,
    CLOB<String>,
    VARCHAR<String>,
}

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

问题:

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

谁能给我解释一下?在回答之前,请考虑以下内容:

  • 我知道泛型类型被删除了:-)
  • 我知道有一些使用类对象的变通方法。它们是转换类型,只要适用就会导致编译器生成的类型转换(例如,当调用workarounds.
  • Generic ()方法
  • 时,泛型类型将在枚举上。因此,它由枚举的每个文字绑定。因此,在编写类似 String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
  • The的代码时,编译器应该知道要应用哪种类型,这同样适用于 T getvalue() 方法中的泛型类型参数。编译器可以在调用 String string = someClass.getValue(LITERAL1)

时应用类型转换

8 31.2K 0 票数 162
EN
java
generics
enums

Stack Overflow用户

发布于 2021-05-26 00:43:56

通过使用这个Java https://github.com/cmoine/generic-enums ,您可以编写类似这样的代码( convert方法是作为示例实现的):

代码语言: javascript
复制
import org.cmoine.genericEnums.GenericEnum;
import org.cmoine.genericEnums.GenericEnumParam;
@GenericEnum
public enum MyEnum {
    LITERAL1(String.class) {
        @Override
        @GenericEnumParam
        public Object convert(Object o) {
            return o.toString(); // example
    LITERAL2(Integer.class) {
        @Override
        @GenericEnumParam
        public Object convert(Object o) {
            return o.hashCode(); // example
    LITERAL3(Object.class) {
        @Override
        @GenericEnumParam
        public Object convert(Object o) {
            return o; // example
 
推荐文章
一身肌肉的莲藕  ·  java 枚举(enum) 全面解读开发者社区
1 月前
茫然的键盘  ·  java反射创建枚举对象_mob64ca12d8c182的技术博客_
1 月前
自信的数据线  ·  枚举的底层原理是什么?-阿里云开发者社区
1 月前
俊秀的葫芦  ·  记者手记:埃塞俄比亚,后会有期!--国际--人民网
1 年前
含蓄的大海  ·  jQuery Ajax请求执行得太频繁
1 年前
谦虚好学的钥匙  ·  如何使用sed只删除双空行?
1 年前
无邪的四季豆  ·  kibana上管理es索引的生命周期,自动删除90天前的索引 - 简书
1 年前
狂野的马克杯  ·  RDweb 2019 Server - ActiveX vs Edge and Chrome - Microsoft Q&A
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号