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