首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中创建EnumSet数组

在Java中创建EnumSet数组
EN

Stack Overflow用户
提问于 2013-09-26 18:06:46
回答 2查看 1.5K关注 0票数 1

我正在尝试创建一个EnumSet数组(使用Eclipse)。

第1版:

代码语言:javascript
复制
EnumSet mySet[] = new EnumSet[3];

这是可行的,但我得到了一个警告:"EnumSet是一个原始类型。对泛型类型EnumSet的引用应该被参数化“。

建议的第2版:

代码语言:javascript
复制
EnumSet<MyEnum> mySet[] = new EnumSet[3];

再次警告:“类型安全: EnumSet[]类型的表达式需要未经检查的转换才能符合EnumSet[]”

建议的第3版:

代码语言:javascript
复制
EnumSet<MyEnum> mySet[] = new EnumSet<MyEnum>[3];

现在我犯了个错误!“无法创建EnumSet的泛型数组”

我该怎么办?没有参数化的EnumSet会有性能问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 18:10:17

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

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

代码语言:javascript
复制
EnumSet<?> mySet[] = new EnumSet<?>[3];

之所以这样做,是因为are类型和无界通配符类型被具体化了。因此,创建一个具有这种组件类型的数组是类型错误。

我们所说的具体化,是指类型信息在运行时可用。具体的参数化类型不是这样的,因为类型信息是作为类型擦除过程丢失的。但是,对于原始类型,根本不存在可能丢失的类型。<?>类型也是如此。因为EnumSet<?>是泛型类型EnumSet<T>的所有实例化的超级类型,所以在编译时没有可能在运行时丢失的关于EnumSet<?>的特定类型信息。

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

代码语言:javascript
复制
List<EnumSet<MyEnum>> mySets = new ArrayList<>();
票数 2
EN

Stack Overflow用户

发布于 2019-07-04 10:49:53

罗希特·贾恩的回答是正确的,只是我想增加一个扩展的例子。它使用浇铸进行初始化。

定义:

代码语言:javascript
复制
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); 
}

}

声明:

代码语言:javascript
复制
  public EnumSet<CellState>[][] minefield; // 2-dimensional array

初始化(需要铸造):

代码语言:javascript
复制
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);
  }
}

用法:

代码语言:javascript
复制
if (!minefield[x][y].contains(CellState.MINE)) {
      minefield[x][y].add(minesNear(x, y));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19035505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档