通用数组创建错误

问题描述 投票:0回答:5

我正在尝试做这样的事情:-

public static ArrayList<myObject>[] a = new ArrayList<myObject>[2];

myObject 是一个类。我收到此错误:- 通用数组创建(箭头指向新的。)

java arrays generics
5个回答
76
投票

你不能拥有泛型类的数组。 Java根本不支持它。

您应该考虑使用集合而不是数组。例如,

public static ArrayList<List<MyObject>> a = new ArrayList<List<MyObject>();

另一个“解决方法”是创建一个像这样的辅助类

class MyObjectArrayList extends ArrayList<MyObject> { }

然后创建一个

MyObjectArrayList
数组。


这里有一篇好文章(现已存档),解释了为什么该语言不允许这样做。本文给出了以下示例,说明如果允许的话可能会发生什么:

List<String>[] lsa = new List<String>[10]; // illegal
Object[] oa = lsa;  // OK because List<String> is a subtype of Object
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[0] = li; 
String s = lsa[0].get(0);

11
投票

有一种比使用 List 更简单的方法来创建通用数组。

首先让

public static ArrayList<myObject>[] a = new ArrayList[2];

然后初始化

for(int i = 0; i < a.length; i++) {
     a[i] = new ArrayList<myObject>();
}

6
投票

你可以做

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList<?>[2];

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList[2];

(前者可能更好。)两者都会导致未经检查的警告,您几乎可以使用以下方法忽略或抑制:@SuppressWarnings(“unchecked”)


-1
投票

如果您尝试声明泛型类的数组列表,您可以尝试:

public static ArrayList<MyObject> a = new ArrayList<MyObject>();

这将为您提供一个 myobject 的数组列表(大小为 10),或者如果您只需要一个大小为 2 的数组列表,您可以这样做:

public static ArrayList<MyObject> a = new ArrayList<MyObject>(2);

或者您可能正在尝试创建数组列表的数组列表:

public static ArrayList<ArrayList<MyObject>> a = new ArrayList<ArrayList<MyObject>>();

虽然我不确定我最后说的是否正确......


-1
投票

在我看来,您使用了错误类型的括号。不能定义泛型数组的原因是类型擦除

另外,变量“a”的声明很脆弱,它应该看起来像这样:

List<myObject>[] a;

当可以使用接口时,不要使用具体类。

© www.soinside.com 2019 - 2024. All rights reserved.