在Java中创建枚举集数组
我正在尝试创建一个枚举集数组(使用Eclipse) 第1版:在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
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));
}