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