Java:不能在switch语句中使用泛型枚举

dar*_*ram 3 java generics parameters enums switch-statement

我有两个枚举类型(并希望用户能够添加自己的).

enum PhoneSensor { A, B };
enum RobotSensor { A, C };  
Run Code Online (Sandbox Code Playgroud)

如果我不在使用枚举类型的方法中使用枚举属性,这可以正常工作.

public <E extends Enum<E>> void registerSensor(E e) {
    System.out.print(e);
}
Run Code Online (Sandbox Code Playgroud)

但是如果我想将模板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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我对删除有一点了解,它在编译时消除了有关模板的任何信息,所以这就是问题所在.但是我尝试传递Class clazz或实现一个接口并没有奏效.什么是一个很好的解决方案?

Pet*_*rey 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,用户可以添加任何实现Sensor的枚举,他们可以随心所欲地执行任何操作,而无需更改代码.