处理在交换机/案例中实现特定接口的不同枚举中的枚举值

Cak*_*ray 5 java enums switch-statement

我有一个空的界面Units,我用来标记不同的enums所以我知道他们拥有不同的单位(例如我有一个enum TemperatureUnits implements Units{}存储华氏温度,摄氏温度等,然后我有一个DistanceUnits持有米,脚等.

我想根据enum传递给方法的值在switch/case中做不同的事情.我希望它接受来自任何enum实现的值Units.问题是,由于enums实际上是不同的类,我必须在switch/case中使用值的限定名称.我的代码看起来像这样:

     public static void foo(Units units){ //units has to be an enum that implements Units

        switch (units){
            case TemperatureUnits.FAHRENHEIT: //I can't say just FAHRENHEIT, because Units itself doesn't 
                //have a FAHRENHEIT value, but it won't let me say TemperatureUnits.FAHRENHEIT because it won't let use
                // qualified enum values as cases.
                //Do stuff
                break;
            case DistanceUnits.METERS:
                //Do other stuff
                break;
            //...etc
Run Code Online (Sandbox Code Playgroud)

如何使用可以使用不同值的switch/case语句enums?

编辑:我的Units界面只是:

public interface Units{
    String getLabel();
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*uag 0

您可以使用instanceof运算符来确定enum传入的内容,然后switch基于适当的enum:

public static void foo(Units units) {
    if(units instanceof DistanceUnits) {
        DistanceUnits d = (DistanceUnits) units; // METERS, INCHES...

        switch (d) {
            case METERS:
                // code
                break;
            case INCHES:
                // code
                break;
        }
    }
    else if(units instanceof TemperatureUnits) {
        TemperatureUnits t = (TemperatureUnits) units; // FAHRENHEIT, CELSIUS

        switch (t) {
            case FAHRENHEIT:
                // code
                break;
            case CELSIUS:
                // code
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑到这一点:

enum DistanceUnits implements Units {
    METERS, INCHES
}

enum TemperatureUnits implements Units {
    FAHRENHEIT, CELSIUS
}

public interface Units {
    // some code
}
Run Code Online (Sandbox Code Playgroud)