【问题标题】:Java: can't use generic enum in switch statementJava:不能在 switch 语句中使用通用枚举
【发布时间】:2012-08-02 16:54:12
【问题描述】:

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

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 中,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 或实现接口方面的尝试没有奏效。有什么好的解决方案?

【问题讨论】:

    标签: java generics parameters enums switch-statement


    【解决方案1】:

    问题是您只能打开一种已知类型。

    在您的情况下,您试图切换多种可能的类型,这本身就有缺陷。 (如何期望用户在这里添加您的代码?)

    你需要的是一个接口

    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 的枚举,他们可以做任何他们想做的事情,而无需更改您的代码。

    【讨论】:

    • 也许我抽象掉了太多手头的问题。我确实定义了一个接口
    • 谢谢。你说得对。打开不同的枚举类型是没有意义的。由于 PhoneSensor 和 RobotSensor 中大约一半的传感器重叠,我想我会有一些代码来处理常见的元素。但我可以避免我在这里尝试做的“打开通用枚举”。
    猜你喜欢
    • 2012-04-30
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    相关资源
    最近更新 更多