gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:35:09 27 4
gpt4 key购买 nike

我是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com