使用interface和Enum进行潜在打字

Rud*_*koŭ 7 java inheritance enums

我有一个IDevice接口和这个接口的两个枚举实现:AndroidDeviceIosDevice.问题是:我想values()在接口引用上使用潜在的输入和调用方法:

private IDevice getDeviceByReadableName(String versionInXml, IDevice devices) {
    for(IDevice device : devices.values()){
    //...
Run Code Online (Sandbox Code Playgroud)

所以我必须添加public IDevice[] values();到我的界面:

public interface IDevice {
     //...
     public IDevice[] values();
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.Eclipse问我remove static modifiers from AndroidDevice(...)


请:

  1. 向我解释为什么它不起作用?
  2. 这个问题的最佳解决方案是什么,我应该使用反射吗?

小智 7

它不起作用的原因是因为values()为每个枚举隐式定义了静态方法.

public enum IOS {

    //Compiler raises an error that values() method is already defined.
    public IOS[] values(){

    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果已经定义了静态方法,则无法添加具有相同签名的新实例级方法.

解决它的最简单方法是使用不同的方法名称.

public interface IDevice {

    IDevice[] allvalues();
}

public enum IOS implements IDevice{

    IPHONE, IPAD;

    @Override
    public IDevice[] allvalues() {
        //return array of iOS devices;
    }
}
Run Code Online (Sandbox Code Playgroud)


Boh*_*ian 4

使用类型交集:

private <T extends Enum<T> & IDevice> T getDeviceByReadableName(String versionInXml, Class<T> deviceClass) {
    for (T device : deviceClass.getEnumConstants()) {
        if (<some-condition>)
            return device;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

绑定 toEnum<T>确保deviceClass.getEnumConstants()将返回值,绑定 to& IDevice确保您会得到IDevice返回值。

称呼它为:

enum IosDevice implements IDevice {
    iPhone, iPad, MacBook;
}

IDevice d = getDeviceByReadableName("<foo/>", IosDevice.class);
Run Code Online (Sandbox Code Playgroud)