我正在尝试创建一个EnumSet数组(使用Eclipse)。
第1版:
EnumSet mySet[] = new EnumSet[3];这是可行的,但我得到了一个警告:"EnumSet是一个原始类型。对泛型类型EnumSet的引用应该被参数化“。
建议的第2版:
EnumSet<MyEnum> mySet[] = new EnumSet[3];再次警告:“类型安全: EnumSet[]类型的表达式需要未经检查的转换才能符合EnumSet[]”
建议的第3版:
EnumSet<MyEnum> mySet[] = new EnumSet<MyEnum>[3];现在我犯了个错误!“无法创建EnumSet的泛型数组”
我该怎么办?没有参数化的EnumSet会有性能问题吗?
发布于 2013-09-26 18:10:17
不能创建具体参数化类型的数组,因为它不是类型安全的。原因是,具体的参数化类型没有被具体化,而数组是具体化的实体。
但是,您可以创建一个原始类型的数组,也可以创建无界通配符类型:
EnumSet<?> mySet[] = new EnumSet<?>[3];之所以这样做,是因为are类型和无界通配符类型被具体化了。因此,创建一个具有这种组件类型的数组是类型错误。
我们所说的具体化,是指类型信息在运行时可用。具体的参数化类型不是这样的,因为类型信息是作为类型擦除过程丢失的。但是,对于原始类型,根本不存在可能丢失的类型。<?>类型也是如此。因为EnumSet<?>是泛型类型EnumSet<T>的所有实例化的超级类型,所以在编译时没有可能在运行时丢失的关于EnumSet<?>的特定类型信息。
另一个选择是简单地创建一个列表。这比将数组与泛型类型混合要好得多:
List<EnumSet<MyEnum>> mySets = new ArrayList<>();发布于 2019-07-04 10:49:53
罗希特·贾恩的回答是正确的,只是我想增加一个扩展的例子。它使用浇铸进行初始化。
定义:
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);
}}
声明:
public EnumSet<CellState>[][] minefield; // 2-dimensional array初始化(需要铸造):
minefield = (EnumSet<CellState>[][]) new EnumSet<?>[width][height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
minefield[x][y] = EnumSet.allOf(CellState.class);
}
}用法:
if (!minefield[x][y].contains(CellState.MINE)) {
minefield[x][y].add(minesNear(x, y));
}https://stackoverflow.com/questions/19035505
复制相似问题