在Java中创建枚举集数组

在Java中创建枚举集数组,java,enumset,Java,Enumset,我正在尝试创建一个枚举集数组(使用Eclipse) 第1版: EnumSet mySet[] = new EnumSet[3]; 这是可行的,但我得到一个警告:“EnumSet是原始类型。对泛型类型EnumSet的引用应该参数化” 建议的第2版: EnumSet<MyEnum> mySet[] = new EnumSet[3]; EnumSet<MyEnum> mySet[] = new EnumSet<MyEnum>[3]; EnumSet mySet

我正在尝试创建一个枚举集数组(使用Eclipse)

第1版:

EnumSet mySet[] = new EnumSet[3];
这是可行的,但我得到一个警告:“EnumSet是原始类型。对泛型类型EnumSet的引用应该参数化”

建议的第2版:

EnumSet<MyEnum> mySet[] = new EnumSet[3];
EnumSet<MyEnum> mySet[] = new EnumSet<MyEnum>[3];
EnumSet mySet[]=新的EnumSet[3];
再次警告:“类型安全:EnumSet[]类型的表达式需要未经检查的转换才能符合EnumSet[]”

建议的第3版:

EnumSet<MyEnum> mySet[] = new EnumSet[3];
EnumSet<MyEnum> mySet[] = new EnumSet<MyEnum>[3];
EnumSet mySet[]=新的EnumSet[3];
现在我犯了一个错误!“无法创建枚举集的通用数组”


我该怎么办?非参数化枚举集是否会有性能问题?

无法创建具体参数化类型的数组,因为它不是类型安全的。原因是,具体的参数化类型没有具体化,而数组是具体化的实体

但是,您可以创建原始类型或无界通配符类型的数组:

EnumSet<?> mySet[] = new EnumSet<?>[3];
EnumSet mySet[]=新的EnumSet[3];
这种方法之所以有效,是因为rawtypes和无界通配符类型被具体化了。因此,使用这种组件类型创建数组是类型安全的

具体化是指类型信息在运行时可用。对于具体的参数化类型,情况并非如此,因为类型信息在类型擦除过程中丢失。但是,对于原始类型,根本没有可能丢失的类型。
类型也是如此。由于
EnumSet
是泛型类型
EnumSet
的所有实例化的超类型,因此编译时没有关于
EnumSet
的特定类型信息会在运行时丢失

另一种选择是简单地创建一个列表。这比将数组与泛型类型混合要好得多:

List<EnumSet<MyEnum>> mySets = new ArrayList<>();
List mySets=new ArrayList();

Rohit Jain的回答是正确的,只是我想添加扩展示例。它使用强制转换进行初始化

定义:

public enum CellState {
  MINE_EMPTY,MINE_NEAR_1,MINE_NEAR_2,MINE_NEAR_3,MINE_NEAR_4,MINE_NEAR_5,MINE_NEAR_6,
  MINE_NEAR_7, MINE_NEAR_8,MINE,CLICK_OPEN, CLICK_MARK;

  public static EnumSet<CellState> ALL_OPTS = EnumSet.allOf(CellState.class);
  public static EnumSet<CellState> NOT_MINE = EnumSet.of(MINE_EMPTY,MINE_NEAR_1,MINE_NEAR_2,MINE_NEAR_3,MINE_NEAR_4,MINE_NEAR_5,MINE_NEAR_6,
        MINE_NEAR_7, MINE_NEAR_8); 
}

好奇:为什么是数组而不是集合,比如
List
?这确实有效。但是,也许我最好使用二维ArrayList.static List mySets=new ArrayList(){private static final long serialVersionUID=8665476113647893645L;{//add sets add(EnumSet.of(a,B,C));add(EnumSet.of(D,E,F,G));};
if (!minefield[x][y].contains(CellState.MINE)) {
      minefield[x][y].add(minesNear(x, y));
}