Harshveer Singh
Harshveer Singh

Reputation: 4207

Generic array creation error

I am trying do something like this:-

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

myObject is a class. I am getting this error:- Generic array creation (arrow is pointing to new.)

Upvotes: 67

Views: 100575

Answers (5)

aioobe
aioobe

Reputation: 421340

You can't have arrays of generic classes. Java simply doesn't support it.

You should consider using a collection instead of an array. For instance,

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

Another "workaround" is to create an auxilliary class like this

class MyObjectArrayList extends ArrayList<MyObject> { }

and then create an array of MyObjectArrayList.


Here is a good article (now archived) on why this is not allowed in the language. The article gives the following example of what could happen if it was allowed:

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);

Upvotes: 77

Strin
Strin

Reputation: 677

There is a easier way to create generic arrays than using List.

First, let

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

Then initialize

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

Upvotes: 11

Rostislav Matl
Rostislav Matl

Reputation: 4553

It seems to me that you use the wrong type of parenthesis. The reason why you can't define an array of generic is type erasure.

Plus, declaration of you variable "a" is fragile, it should look this way:

List<myObject>[] a;

Do not use a concrete class when you can use an interface.

Upvotes: -1

newacct
newacct

Reputation: 122538

You can do

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

or

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

(The former is probably better.) Both will cause unchecked warnings, which you can pretty much ignore or suppress by using: @SuppressWarnings("unchecked")

Upvotes: 6

temelm
temelm

Reputation: 788

if you are trying to declare an arraylist of your generic class you can try:

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

this will give you an arraylist of myobject (size 10), or if u only need an arraylist of size 2 you can do:

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

or you may be trying to make an arraylist of arraylists:

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

although im not sure if the last this i said is correct...

Upvotes: -1

Related Questions