Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #8973 > unrolled thread

Cannot create a generic array of <type>

Started byWarren Tang <nospam@tangcs.com>
First post2011-10-19 12:06 +0800
Last post2011-10-19 10:00 -0700
Articles 9 — 3 participants

Back to article view | Back to comp.lang.java.programmer


Contents

  Cannot create a generic array of <type> Warren Tang <nospam@tangcs.com> - 2011-10-19 12:06 +0800
    Re: Cannot create a generic array of <type> Warren Tang <nospam@tangcs.com> - 2011-10-19 13:22 +0800
    Re: Cannot create a generic array of <type> Lew <lewbloch@gmail.com> - 2011-10-18 23:28 -0700
      Re: Cannot create a generic array of <type> Warren Tang <nospam@tangcs.com> - 2011-10-19 18:11 +0800
        Re: Cannot create a generic array of <type> markspace <-@.> - 2011-10-19 04:50 -0700
          Re: Cannot create a generic array of <type> Warren Tang <nospam@tangcs.com> - 2011-10-20 00:43 +0800
            Re: Cannot create a generic array of <type> markspace <-@.> - 2011-10-19 12:21 -0700
              Re: Cannot create a generic array of <type> Warren Tang <nospam@tangcs.com> - 2011-10-21 11:05 +0800
        Re: Cannot create a generic array of <type> Lew <lewbloch@gmail.com> - 2011-10-19 10:00 -0700

#8973 — Cannot create a generic array of <type>

FromWarren Tang <nospam@tangcs.com>
Date2011-10-19 12:06 +0800
SubjectCannot create a generic array of <type>
Message-ID<j7lic6$lob$1@speranza.aioe.org>
Hi,everybody

The following code:

  ArrayList<Integer>[] indexedValues = new ArrayList<Integer>[5];

generates an error:

  Cannot create a generic array of ArrayList<Integer>

Could someone explain this to me?

Regards,
Warren Tang

[toc] | [next] | [standalone]


#8976

FromWarren Tang <nospam@tangcs.com>
Date2011-10-19 13:22 +0800
Message-ID<j7lmrb$tt1$1@speranza.aioe.org>
In reply to#8973
On 10/19/2011 12:06 PM, Warren Tang wrote:
> Hi,everybody
> 
> The following code:
> 
>    ArrayList<Integer>[] indexedValues = new ArrayList<Integer>[5];
> 
> generates an error:
> 
>    Cannot create a generic array of ArrayList<Integer>
> 
> Could someone explain this to me?
> 
> Regards,
> Warren Tang

Finally found a good article explaining this. It's about Type Erasure:
http://code.stephenmorley.org/articles/java-generics-type-erasure/

[toc] | [prev] | [next] | [standalone]


#8977

FromLew <lewbloch@gmail.com>
Date2011-10-18 23:28 -0700
Message-ID<11633107.472.1319005728890.JavaMail.geo-discussion-forums@prfp13>
In reply to#8973
Warren Tang wrote:
> The following code:
> 
>   ArrayList<Integer>[] indexedValues = new ArrayList<Integer>[5];
> 
> generates an error:
> 
>   Cannot create a generic array of ArrayList<Integer>
> 
> Could someone explain this to me?

Sure.  The short answer is that generics and arrays do not mix.  Slightly longer, the Java Language Specification explicitly forbids arrays of non-reifiable types:

"An array creation expression specifies the element type, the number of levels of nested arrays, and the length of the array for at least one of the levels of nesting. ... It is a compile-time error if the element type is not a reifiable type".
<http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3>

Generic types like 'ArrayList<Integer>' are not reifiable, that is, you cannot actually create such a type at runtime due to type erasure.

The longer answer is that arrays are reifiable, therefore their element types must also be reifiable.  Unlike generics, arrays carry their base type with them at run time - they "know" their type.  Generic types do not.  (You can get around this with a run-time type token, or RTTT, but that's a topic for another discussion.)  So when you try to make an array of a generic type you deprive the array of information it needs.  This the compiler won't allow.

Back to the short answer: don't mix arrays and generics.  There are a few conversion classes in the Collections framework that let you convert between them, but use them sparingly and usually to go from array-land to collections-land to stay.

Arrays.asList
static <T> List<T> asList(T... a)
<http://download.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T...)>

-- 
Lew

[toc] | [prev] | [next] | [standalone]


#8983

FromWarren Tang <nospam@tangcs.com>
Date2011-10-19 18:11 +0800
Message-ID<j7m7nv$766$4@speranza.aioe.org>
In reply to#8977
Thanks for the info. If I use the reified version of the generic - i.e. 
the erased version of the generic - ArrayList instead of 
ArrayList<Integer>, the compile error goes away and there is no run-time 
error either.

ArrayList<Integer>[] indexedValues = new ArrayList[5];

Although there is still a type safety warning.

[toc] | [prev] | [next] | [standalone]


#8988

Frommarkspace <-@.>
Date2011-10-19 04:50 -0700
Message-ID<j7mdic$67e$1@dont-email.me>
In reply to#8983
On 10/19/2011 3:11 AM, Warren Tang wrote:
> Thanks for the info. If I use the reified version of the generic - i.e.
> the erased version of the generic - ArrayList instead of
> ArrayList<Integer>, the compile error goes away and there is no run-time
> error either.
>
> ArrayList<Integer>[] indexedValues = new ArrayList[5];
>
> Although there is still a type safety warning.


How about :


   ArrayList<ArrayList<Integer>> indexedValues =
     new ArrayList<ArrayList<Integer>>();

[toc] | [prev] | [next] | [standalone]


#9001

FromWarren Tang <nospam@tangcs.com>
Date2011-10-20 00:43 +0800
Message-ID<j7muo9$6oj$1@speranza.aioe.org>
In reply to#8988
On 10/19/2011 7:50 PM, markspace wrote:
> On 10/19/2011 3:11 AM, Warren Tang wrote:
>> Thanks for the info. If I use the reified version of the generic - i.e.
>> the erased version of the generic - ArrayList instead of
>> ArrayList<Integer>, the compile error goes away and there is no run-time
>> error either.
>>
>> ArrayList<Integer>[] indexedValues = new ArrayList[5];
>>
>> Although there is still a type safety warning.
>
>
> How about :
>
>
> ArrayList<ArrayList<Integer>> indexedValues =
> new ArrayList<ArrayList<Integer>>();
>
>

Sure. I just  wanted to know why.

[toc] | [prev] | [next] | [standalone]


#9007

Frommarkspace <-@.>
Date2011-10-19 12:21 -0700
Message-ID<j7n7vs$266$1@dont-email.me>
In reply to#9001
On 10/19/2011 9:43 AM, Warren Tang wrote:
> On 10/19/2011 7:50 PM, markspace wrote:
>> On 10/19/2011 3:11 AM, Warren Tang wrote:
>>> Thanks for the info. If I use the reified version of the generic - i.e.
>>> the erased version of the generic - ArrayList instead of
>>> ArrayList<Integer>, the compile error goes away and there is no run-time
>>> error either.
>>>
>>> ArrayList<Integer>[] indexedValues = new ArrayList[5];
>>>
>>> Although there is still a type safety warning.


Because what you did is not type safe.  It's also a terrible idea and 
poor practice.  Bosses and co-workers will not like this sort of thing.


> Sure. I just wanted to know why.


What you have there is not the reified version of a generic.  It's a raw 
type.  It has no parameter type.  It's a really bad idea to use raw 
types or to mix raw types and generics unless you must (there are a few 
specific instances where you can't avoid it).  Here, you can almost 
certainly avoid raw types so do so.

[toc] | [prev] | [next] | [standalone]


#9064

FromWarren Tang <nospam@tangcs.com>
Date2011-10-21 11:05 +0800
Message-ID<j7qni9$naa$1@speranza.aioe.org>
In reply to#9007
On 10/20/2011 3:21 AM, markspace wrote:
> On 10/19/2011 9:43 AM, Warren Tang wrote:
>> On 10/19/2011 7:50 PM, markspace wrote:
>>> On 10/19/2011 3:11 AM, Warren Tang wrote:
>>>> Thanks for the info. If I use the reified version of the generic - i.e.
>>>> the erased version of the generic - ArrayList instead of
>>>> ArrayList<Integer>, the compile error goes away and there is no
>>>> run-time
>>>> error either.
>>>>
>>>> ArrayList<Integer>[] indexedValues = new ArrayList[5];
>>>>
>>>> Although there is still a type safety warning.
>
>
> Because what you did is not type safe. It's also a terrible idea and
> poor practice. Bosses and co-workers will not like this sort of thing.
>
>
>> Sure. I just wanted to know why.
>
>
> What you have there is not the reified version of a generic. It's a raw
> type. It has no parameter type. It's a really bad idea to use raw types
> or to mix raw types and generics unless you must (there are a few
> specific instances where you can't avoid it). Here, you can almost
> certainly avoid raw types so do so.
>

Thanks for the suggestion. Though it's a local variable with controlled 
usage, I'd better follow the best practice and use ArrayList instead of 
arrays.

[toc] | [prev] | [next] | [standalone]


#9003

FromLew <lewbloch@gmail.com>
Date2011-10-19 10:00 -0700
Message-ID<2010013.9.1319043603285.JavaMail.geo-discussion-forums@vbat14>
In reply to#8983
Warren Tang wrote:
> Thanks for the info. If I use the reified version of the generic - i.e. 
> the erased version of the generic - ArrayList instead of 
> ArrayList<Integer>, the compile error goes away and there is no run-time 
> error either.
> 
> ArrayList<Integer>[] indexedValues = new ArrayList[5];
> 
> Although there is still a type safety warning.

DO NOT USE RAW TYPES!!!

You get a warning because your code is not type safe.  BAD!

DO NOT MIX ARRAYS AND GENERICS!!!

DO NOT USE RAW TYPES!!!

-- 
Lew

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.programmer


csiph-web