从两种类型的 Enum 之一实例化 EnumSet
Instantiate EnumSet from one of two types of Enum
我声明了这两个枚举:
public enum EnumOne implements EnumInterface {
SomethingHere,
SomethingThere;
public void someMethod () { }
}
public enum EnumTwo implements EnumInterface {
SomethingOverYonder;
public void someMethod () { }
}
如此处所示,它们都实现了此接口。
public Interface EnumInterface {
someMethod();
}
我在这里定义了一个 class,它包含一个 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;
}
}
测试:
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();
}
}
不清楚你在找什么,但如果你只是想 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 enum EnumOne implements EnumInterface {
SomethingHere,
SomethingThere;
public void someMethod () { }
}
public enum EnumTwo implements EnumInterface {
SomethingOverYonder;
public void someMethod () { }
}
如此处所示,它们都实现了此接口。
public Interface EnumInterface {
someMethod();
}
我在这里定义了一个 class,它包含一个 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;
}
}
测试:
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();
}
}
不清楚你在找什么,但如果你只是想 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;
}
}
}