Java 从两种枚举类型之一实例化枚举集

Java 从两种枚举类型之一实例化枚举集,java,generics,enums,enumset,Java,Generics,Enums,Enumset,我将这两个枚举声明为: public enum EnumOne implements EnumInterface { SomethingHere, SomethingThere; public void someMethod () { } } public enum EnumTwo implements EnumInterface { SomethingOverYonder; public void someMethod () { } } 如图所示,它

我将这两个枚举声明为:

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;
        }
    }
}
现在,我知道我必须使用泛型来完成这项工作,但我不知道该怎么做,因为我对它还不够熟悉,我希望你能给我一些启发

提前感谢您的回答。

我就是这样做的:

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

}
公共类SomeClass{

private EnumSet不清楚您在寻找什么,但如果您只是希望
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;
        }
    }
}
公共类SomeClass{

private EnumSetBtw enum不能用作变量名。@MouseeEvent感谢您的提醒,我会将其编辑掉,尽管我认为我想做的事情仍然很好。如果以后您想使用特定于EnumSet的方法,它将不起作用,因为您无法为
someEnum
声明提供正确的类型参数。如果我们只是将它用作一个
集合
,然后简单地
设置someEnum=newhashmap(EnumSet.allOf(EnumOne.class))
。然而,我觉得这在设计上是根本错误的……您可能想告诉我们为什么要这样做this@AdrinShum我目前正在从事一个项目,该项目包括向客户销售不同类型的家具。客户需要指定他想要用什么样的木材制作家具。我已经创建了r到目前为止,指接木材和三聚氰胺木材都有。每种类型的木材都有其独有的规格,因此需要单独定义。基本上,我希望客户能够选择他想要的木材类型,为此,我需要使用属于他所选木材类型的枚举器。@AdrianShum你的意思可能是
HashSet
对吧?嗯,这似乎完成了我想要做的事情。只有一个问题。编译器正在抛出什么样的警告,为什么要抑制它?没什么好担心的,对吧?请原谅我的无知,这是我第一次看到其中一个。未经检查的泛型类型转换。它没有如果在参数或返回类型中不使用类型参数,那么使用泛型方法是有意义的。这里使用泛型是错误的,因为类型参数意味着您的代码对于满足边界的任意选择
E
都是正确的,包括,但这里显然不是,因为两者都不是
EnumSet
nor
EnumSet
EnumSet
的一个子类型。我希望EnumSet根据用户的需要假定一个或另一个Enum的所有值。我在之前的评论中说过,我正在从事的项目包括向用户出售不同类型的家具。家具由melami或melami制成ne或指接木材。由用户决定家具的材质。这两个枚举用于描述这两种木材。
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;
        }
    }
}