Java 11+ "generic array creation"错误(使用 BlueJ)

标签 java arrays string calendar bluej

我是 Java 新手,我正在使用当前版本的 BlueJ 进行编程。当尝试初始化包含一周中所有日期的字符串数组时,我收到错误消息“通用数组创建”,我很好奇如何解决这个问题,因为我在网上找到的所有结果都非常旧并且超出了日期。该代码用于还可以跟踪星期几的时钟。我的代码如下:

daysOfWeek = new ArrayList<String>[]{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

我非常乐意用提供帮助所需的任何其他信息来更新这篇文章。感谢您抽出时间。

最佳答案

从 Java 13 开始,通用数组创建仍然被禁止。原因与数组在运行时知道其组件类型这一事实有关,但泛型会遭受所谓的 type-erasure 的困扰。 。也就是说,您的问题有以下示例:

daysOfWeek = new ArrayList<String>[]{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

上面试图创建一个 ArrayList<String>[] ;换句话说,是数组列表的数组。这很可能不是您真正想要做的。尽管名字ArrayList ,该类并不直接参与数组的创建,该名称仅表示该列表由数组支持。鉴于您的数据只是一周中每一天的名称,您可能想要的是 String[]List<String> :

// array
String[] daysOfWeek = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

// list
List<String> daysOfWeek = new ArrayList<>(List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"));

请注意,如果您不使用 Java 11+,则可以替换为 List#of Arrays#asList(T...) 。如果您使用的是 Java 11+,请考虑使用 List#of 的结果直接,而不是将结果复制到可修改的 ArrayList 中(假设您不打算修改该列表)。

您可能还想考虑使用 java.time.DayOfWeek 枚举而不是 String代表一周中的每一天。枚举类型更加安全,不易出错,并且允许与任何其他对象轻松交互 java.time您可能使用的类。

List<DayOfWeek> daysOfWeek = List.of(DayOfWeek.values());
<小时/>

您应该始终默认使用 List (或其他一些集合)在使用数组之前。如果您绝对必须使用数组,则可以使用以下方法解决“通用数组创建”错误:

// unbounded T
@SuppressWarnings("unchecked")
T[] array = (T[]) new Object[size];

// or if, for instance, T is upper-bounded by CharSequence
@SuppressWarnings("unchecked")
T[] array = (T[]) new CharSequence[size];

// or if the component type is itself generic
@SuppressWarnings("unchecked")
Comparator<String>[] array = (Comparator<String>[]) new Comparator[size];

但是,以上所有内容都只是编译时技巧。每个数组仍然允许存储作为原始组件类型实例的任何对象,而不会抛出 ArrayStoreException在运行时。换句话说,第一个数组仍将接受任何 Object ,第二个数组仍将接受任何 CharSequence ,第三个数组仍将接受任何 Comparator<?> 。这就是为什么对上述每一项都会发出“未经检查的强制转换”警告的原因;也就是说,如果没有 @SuppressWarnings("unchecked")存在注释。

关于Java 11+ "generic array creation"错误(使用 BlueJ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58054709/

相关文章:

c - 如何将具体的二维数组连接到先前定义的指向头文件中指针的指针?

c# - 连接以逗号分隔的字典键

c++ - Python 到 C++ 字符编码

java - 如何更正哈希函数?

java - 如何在 Java 中检测适当的字符串区域设置

javascript - 使用点符号作为键不可能从数组的对象创建修改后的数组

c - 每次迭代都会替换索引中的值

python - 如何查找字符串中某个字符所有出现的索引?

java - 如何使用 Java 和 Jackson 库反序列化 Json 字符串以获得多态结果?

java - 强制 BigDecimals 使用科学记数法