3

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

enum PhoneSensor { A, B };
enum RobotSensor { A, C };  

如果我不在采用 enum 类型的方法中使用 Enum 属性,这可以正常工作。

public <E extends Enum<E>> void registerSensor(E e) {
    System.out.print(e);
}

但是,如果我希望将模板 E 识别为枚举(用于此处的开关),我会收到错误“无法打开 E 类型的值”。(在 Eclipse 中,switch(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 或实现接口方面的尝试没有奏效。有什么好的解决方案?

4

1 回答 1

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();
    }
}

通过这种方式,用户可以添加任何实现 Sensor 的枚举,并且他们可以做任何他们想做的事情,而无需更改您的代码。

于 2012-08-02T16:59:22.913 回答