从Enum的两种类型之一实例化EnumSet



我将这两个枚举声明为:

public enum EnumOne implements EnumInterface {
    SomethingHere,
    SomethingThere;
    public void someMethod () { }
}
public enum EnumTwo implements EnumInterface {
    SomethingOverYonder;
    public void someMethod () { }
}

如图所示,它们都实现了这个接口。

public Interface EnumInterface {
     someMethod();
}

我在这里定义了一个类,它包含一个EnumSet,它将从Enum1或Enum2中获取所有元素。这将通过一个以索引作为参数的方法来定义。像这样:

public class SomeClass {
    private EnumSet someEnum;
    public void setEnumType (int index) {
        switch (index) {
        case 1:
            someEnum = EnumSet.allOf(EnumOne.class);
            break;
        case 2:
            someEnum = EnumTwo.allOf(EnumTwo.class);
            break;
        }
    }
}

现在,我知道我必须使用泛型来完成这个,但是我不知道怎么做,因为我对它不够熟悉,我希望你能给我一点启发。

提前感谢您的回答。

不清楚您在寻找什么,但如果您只是希望someEnum不使用原始类型声明,则可以这样做:

public class SomeClass {
    private EnumSet<? extends EnumInterface> someEnum;
    public void setEnumType (int index) {
        switch (index) {
        case 1:
            someEnum = EnumSet.allOf(EnumOne.class);
            break;
        case 2:
            someEnum = EnumSet.allOf(EnumTwo.class);
            break;
        }
    }
}

我是这样做的:

public class SomeClass {                                                                                                                                                  
    private EnumSet<? extends EnumInterface> someEnum;                                                                                                                    
    // I control it, so it's checked                                                                                                                                      
    @SuppressWarnings("unchecked")                                                                                                                                        
    public <E extends Enum<E> & EnumInterface> void setEnumType(int index) {                                                                                              
        switch (index) {                                                                                                                                                  
        case 1:                                                                                                                                                           
            someEnum = (EnumSet<E>) EnumSet.allOf(Enum1.class);                                                                                                           
            break;                                                                                                                                                        
        case 2:                                                                                                                                                           
            someEnum = (EnumSet<E>) EnumSet.allOf(Enum2.class);                                                                                                           
            break;                                                                                                                                                        
        default:                                                                                                                                                          
        }                                                                                                                                                                 
    }  

    public EnumSet<? extends EnumInterface> getEnum() {                                                                                                                   
        return someEnum;                                                                                                                                                  
    }     
}

测试:

public static void main(String[] args) {                                                                                                                              
    SomeClass c = new SomeClass();                                                                                                                                    
    c.setEnumType(2);                                                                                                                                                 
    EnumSet<? extends EnumInterface> e = c.getEnum();                                                                                                                 
    System.out.println(e);                                                                                                                                            
    for (EnumInterface ei : e)                                                                                                                                        
        ei.someMethod();                                                                                                                                              
    }                                                                                                                                                                     
} 

最新更新