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

private IDevice getDeviceByReadableName(String versionInXml, IDevice devices) {
    for(IDevice device : devices.values()){
    //...

所以我必须在我的界面中添加public IDevice[] values();:
public interface IDevice {
     //...
     public IDevice[] values();
}

但这是行不通的。 Eclipse要求我remove static modifiers from AndroidDevice(...)
请:
  • 向我解释为什么它不起作用?
  • 解决此问题的最佳方法是什么,我应该改用反射吗?
  • 最佳答案

    使用类型交集:

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

    绑定(bind)到Enum<T>可以确保deviceClass.getEnumConstants()将返回值,而绑定(bind)到& IDevice则可以确保您返回IDevice

    像这样称呼它:
    enum IosDevice implements IDevice {
        iPhone, iPad, MacBook;
    }
    
    IDevice d = getDeviceByReadableName("<foo/>", IosDevice.class);
    

    09-15 21:36