Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #8973 > unrolled thread
| Started by | Warren Tang <nospam@tangcs.com> |
|---|---|
| First post | 2011-10-19 12:06 +0800 |
| Last post | 2011-10-19 10:00 -0700 |
| Articles | 9 — 3 participants |
Back to article view | Back to comp.lang.java.programmer
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
| From | Warren Tang <nospam@tangcs.com> |
|---|---|
| Date | 2011-10-19 12:06 +0800 |
| Subject | Cannot 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]
| From | Warren Tang <nospam@tangcs.com> |
|---|---|
| Date | 2011-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]
| From | Lew <lewbloch@gmail.com> |
|---|---|
| Date | 2011-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]
| From | Warren Tang <nospam@tangcs.com> |
|---|---|
| Date | 2011-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]
| From | markspace <-@.> |
|---|---|
| Date | 2011-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]
| From | Warren Tang <nospam@tangcs.com> |
|---|---|
| Date | 2011-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]
| From | markspace <-@.> |
|---|---|
| Date | 2011-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]
| From | Warren Tang <nospam@tangcs.com> |
|---|---|
| Date | 2011-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]
| From | Lew <lewbloch@gmail.com> |
|---|---|
| Date | 2011-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