Tiger学习 之 创建Enum<Enumerated>

本文介绍了Java中枚举(Enum)的基本概念及其使用方法。详细讲述了如何定义枚举类型,并探讨了枚举与类之间的关系。同时,文章还讨论了枚举的一些特性,例如其继承自java.lang.Enum类,以及如何进行比较等。
Enum,Tiger新引进的类型,之前只能由class和interface来创建新类型...
主要摆脱 通过“public static final”的变量声明...<常量>
创建、使用的方式跟class类似,标识符一般用大写,如
[quote]
public enum EnumFirst {A, B, C, D, F, INCOMPLETE}
[/quote]
一些特性...
Enum是class
Enum继承过java.lang.Enum
Enum没有public构造函数
Enum值是public、static、 final的
Enum可以用 == 和equal 比较
....API

行内Inline声明Enum
跟class的成员类声明一样,看代码...
[quote]
public class TestMain {
public enum EnumFirst { A, B, C, D, F, INCOMPLETE}
[color=blue]//也可以"public static enum EnumFirst { A, B, C, D, F, INCOMPLETE}"这样写,但是是画蛇添足,不推荐[/color]
}
[/quote]
在 Java 中,将 `Class<?>`(尤其是 `Class<? extends Enum>`)传递给需要 `Class<? extends Enum<?>>` 类型的参数时,可能会遇到泛型类型不匹配的编译错误。以下是详细的解决方案和代码示例: --- ### **问题场景** 假设有以下方法需要 `Class<? extends Enum<?>>` 类型: ```java public void processEnum(Class<? extends Enum<?>> enumClass) { Enum<?>[] values = enumClass.getEnumConstants(); for (Enum<?> value : values) { System.out.println(value.name()); } } ``` 但你手头有一个 `Class<?>` 类型的变量(可能是通过反射或其他方式获取的),直接传递会报错: ```java Class<?> rawEnumClass = MyEnum.class; // 实际类型是 Class<? extends MyEnum> processEnum(rawEnumClass); // 编译错误:Required Class<? extends Enum<?>>,但提供的是 Class<?> ``` --- ### **解决方案** #### 1. **强制类型转换(需确保类型安全)** 如果确定 `rawEnumClass` 一定是枚举类型,可以通过强制转换并抑制警告: ```java Class<?> rawEnumClass = MyEnum.class; @SuppressWarnings("unchecked") Class<? extends Enum<?>> enumClass = (Class<? extends Enum<?>>) rawEnumClass; processEnum(enumClass); // 编译通过 ``` #### 2. **运行时检查 + 安全转换** 使用 `Class.asSubclass()` 进行安全的类型转换: ```java Class<?> rawEnumClass = MyEnum.class; if (Enum.class.isAssignableFrom(rawEnumClass)) { Class<? extends Enum<?>> enumClass = rawEnumClass.asSubclass(Enum.class); processEnum(enumClass); } else { throw new IllegalArgumentException("Class is not an enum type"); } ``` #### 3. **修改方法签名(推荐)** 如果可能,直接修改方法参数为 `Class<?>` 并在方法内部处理: ```java public void processEnum(Class<?> enumClass) { if (enumClass.isEnum()) { Enum<?>[] values = (Enum<?>[]) enumClass.getEnumConstants(); for (Enum<?> value : values) { System.out.println(value.name()); } } else { throw new IllegalArgumentException("Class is not an enum type"); } } ``` #### 4. **泛型方法辅助转换** 通过泛型方法桥接类型: ```java public <T extends Enum<T>> void processEnumGeneric(Class<T> enumClass) { processEnum(enumClass); // 自动兼容 Class<? extends Enum<?>> } // 调用 processEnumGeneric(MyEnum.class); // 直接传递枚举类 ``` --- ### **完整代码示例** ```java public class EnumConversionExample { // 目标方法:需要 Class<? extends Enum<?>> public static void processEnum(Class<? extends Enum<?>> enumClass) { for (Enum<?> value : enumClass.getEnumConstants()) { System.out.println(value.name()); } } // 安全转换方法 public static Class<? extends Enum<?>> safeConvert(Class<?> rawClass) { if (rawClass.isEnum()) { return rawClass.asSubclass(Enum.class); } throw new IllegalArgumentException("Class is not an enum type"); } public static void main(String[] args) { // 示例枚举 enum Color { RED, GREEN, BLUE } // 方法1:强制转换(需抑制警告) Class<?> rawClass = Color.class; @SuppressWarnings("unchecked") Class<? extends Enum<?>> enumClass1 = (Class<? extends Enum<?>>) rawClass; processEnum(enumClass1); // 方法2:运行时检查 + 安全转换 Class<? extends Enum<?>> enumClass2 = safeConvert(Color.class); processEnum(enumClass2); // 方法3:直接传递枚举类(如果方法签名支持泛型) processEnumGeneric(Color.class); } // 泛型方法示例 public static <T extends Enum<T>> void processEnumGeneric(Class<T> enumClass) { processEnum(enumClass); } } ``` --- ### **关键点总结** 1. **类型安全**:强制转换前必须通过 `isEnum()` 或 `asSubclass()` 确保类型正确。 2. **设计建议**:优先使用 `Class<?>` 作为参数并在方法内部处理,避免泛型嵌套问题。 3. **泛型与通配符**:`Class<? extends Enum<?>>` 表示“任何枚举类型的 Class 对象”,而 `Class<?>` 是原始类型,需要显式转换。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值