通用数组创建错误

Har*_*ngh 46 java arrays generics

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

public static ArrayList<myObject>[] a = new ArrayList<myObject>[2];
Run Code Online (Sandbox Code Playgroud)

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

aio*_*obe 54

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

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

public static ArrayList<List<MyObject>> a = new ArrayList<List<MyObject>();
Run Code Online (Sandbox Code Playgroud)

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

class MyObjectArrayList extends ArrayList<MyObject> { }
Run Code Online (Sandbox Code Playgroud)

然后创建一个数组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); 
Run Code Online (Sandbox Code Playgroud)

  • 没有泛型的同样的问题`String [] x = new String [10]; 对象[] y = x; y [1] = 10; // boxing String z = x [1];` (5认同)
  • 我看不出有什么区别: Integer [] integerArray=new Integer[20]; 对象[]objectArray=integerArray; objectArray[0]= "世界你好!"; 整数数组[0].floatValue(); 此代码编译并在运行时抛出此异常: java.lang.ArrayStoreException: java.lang.String 为什么? (2认同)

Str*_*rin 8

创建通用数组比使用List更简单.

首先,让我们

public static ArrayList<myObject>[] a = new ArrayList[2];
Run Code Online (Sandbox Code Playgroud)

然后初始化

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

  • 或者,为避免原始类型,`ArrayList <myObject> [] a =(ArrayList <myObject> [])new ArrayList <?> [2];` (2认同)

new*_*cct 6

你可以做

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList<?>[2];
Run Code Online (Sandbox Code Playgroud)

要么

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList[2];
Run Code Online (Sandbox Code Playgroud)

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