Tiger学习 之 switch中的Enum<Enumerated>

Java枚举与switch用法
本文探讨了Java中枚举类型与switch语句的结合使用。介绍了如何利用枚举对象进行case匹配,并讨论了编译时的处理方式,包括通过创建跳转表或转换为if-else语句的方法。
Tiger之前的switch只能运用 int、short、char、bye值(不能用String很麻烦...),现在支持Enum...
[quote]
switch (te.getEn()) { [color=blue]//te.getEn() 取得一个Enum对象,进行case[/color]
case A : System.out.println("Hello A");
case B : System.out.println("Hello B");
[color=blue] //奇怪吧?关于 case A,case B,不能把Enum加上,如 EnumFirst.A 会出错的...所以要小心,必须case到所有的值(如果需要)[/color]
default: System.out.println("Hello default");[color=blue]//推荐加上default,防止Enum变化,没有捕获到[/color]
}
[/quote]

关于Enum的编译...
编译的时候不会转化成case ...(nt、short、char、bye)值的,有两种处理方式:
1.会创建一个 jump table,然后通过ordinal来处理(同一编译单元)
2.转换成if else ....判断(不同一编译单元)
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<?>` 是原始类型,需要显式转换。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值