我有两种枚举类型(并且希望用户能够添加自己的类型)。
enum PhoneSensor { A, B };
enum RobotSensor { A, C };
如果我在接受枚举类型的方法中不使用Enum属性,这可以正常工作。
public <E extends Enum<E>> void registerSensor(E e) {
System.out.print(e);
}
但是,如果我想将模板E识别为枚举(用于此处的开关),我得到了 错误“无法打开类型E的值” (在Eclipse中,开关(e)中的'e'用红色加下划线)
public <E extends Enum<E>> void registerSensor(EnumSet<E> eSet) {
for (E e : eSet) {
System.out.print("value is ");
// Cannot switch on a value of type E.
// Only convertible int values or enum variables are permitted
switch(e) {
case PhoneSensor.A:
System.out.print(e);
default:
return;
}
}
}
我对删除有一点了解,它在编译时清除了有关模板的任何信息,这就是问题所在。但是我尝试传递Class clazz或实现一个接口并没有奏效。对此有什么好处?
答案 0 :(得分:9)
问题是您只能打开一种已知类型。
在你的情况下,你试图切换多种可能有缺陷的类型。 (用户如何期望在此处添加代码?)
您需要的是一个界面
interface Sensor {
void sense();
}
enum PhoneSensor implements Sensor {
A, B;
@Override
public void sense() {
System.out.println(this);
}
}
public <E extends Enum<E> & Sensor> void registerSensor(EnumSet<E> eSet) {
for (E e : eSet) {
System.out.print("value is ");
e.sense();
}
}
这样用户可以添加任何实现传感器的枚举,他们可以随心所欲地执行任何操作,而无需更改代码。