From: Lew on
Lew wrote:
>> Arrays and generics don't mix.  It has to do with arrays being
>> reifiable but not generics.
>
>> From the JLS, 10.10:
>> "... creation of arrays of non-reifiable types is forbidden."
>> <http://java.sun.com/docs/books/jls/third_edition/html/
>> arrays.html#10.10>
>

Mike Schilling wrote:
> There aren't many instances in Java of "That's how it works.  Don't ask why;
> you're better off not knowing", but this is one of them.- Hide quoted text -
>

It's funny you should say that, because the JLS says why in the
section I cited.

--
Lew
"Well, show me the way / To the next whiskey bar. /
Oh, don't ask why. / Oh, don't ask why."
"The Alabama Song", Bertold Brecht

From: Kevin McMurtrie on
In article <i0vohh$1ep$1(a)news.eternal-september.org>,
"Mike Schilling" <mscottschilling(a)hotmail.com> wrote:

> "Lew" <lew(a)lewscanon.com> wrote in message
> news:f4a6bdb8-c41e-4978-9abf-70e5791f87f5(a)c33g2000yqm.googlegroups.com...
> > Ross wrote:
> >> Let's say that I have a java.util.ArrayList which will contain only
> >> strings. So, I can declare this as:
> >>
> >> ArrayList<String> blah = new ArrayList<String>();
> >>
> >> So far so good, but let's say that blah is an array in itself. I'd
> >> expect to be able to do this:
> >>
> >> ArrayList<String> blah[] = new ArrayList<String>[ 50 ];
> >>
> >> However, if I do that, I get a compile time error saying something
> >> about creating a generic array. If I modify the code to:
> >>
> >> ArrayList<String> blah[] = new ArrayList[ 50 ];
> >>
> >> Then, it compiles and works, but gives me a warning about using a
> >> deprecated blah blah blah.
> >>
> >> What gives?
> >
> > Arrays and generics don't mix. It has to do with arrays being
> > reifiable but not generics.
> >
> > From the JLS, �10.10:
> > "... creation of arrays of non-reifiable types is forbidden."
> > <http://java.sun.com/docs/books/jls/third_edition/html/
> > arrays.html#10.10>
>
> There aren't many instances in Java of "That's how it works. Don't ask why;
> you're better off not knowing", but this is one of them.

I'd like to submit this one too:

-----------

public class Foo
{
class InnerFoo { }
void method ()
{
InnerFoo x[]= new InnerFoo[100]; //Compiles
}
}

-----------

public class Foo<BAR>
{
class InnerFoo { }
void method ()
{
InnerFoo x[]= new InnerFoo[100]; //Doesn't compile
}
}

-----------

public class Foo<BAR>
{
class InnerFoo { }
void method ()
{
InnerFoo x[]= new Foo.InnerFoo[100]; //Compiles
}
}
--
I won't see Google Groups replies because I must filter them as spam
From: Peter Duniho on
Kevin McMurtrie wrote:
> [...]
> public class Foo<BAR>
> {
> class InnerFoo { }
> void method ()
> {
> InnerFoo x[]= new InnerFoo[100]; //Doesn't compile
> }
> }

I'd guess the answer to that may actually be specifically addressed in
the spec too.

But even if not, it seems to me that your example is just a variant on
the situation that's already being discussed. The above version of the
code involves a non-reified generic type (Foo<BAR>.InnerFoo), of which
you can't make an array, and for the same reason as indicated before.

By explicitly choosing the raw type to qualify InnerFoo, you strip the
generic and thus create a legal array type. Note that while the third
example compiles, you do get a warning about the need for an unchecked
conversion. That's only slightly better than it simply not compiling at
all.

Pete
From: Lew on
Kevin McMurtrie wrote:
>> [...]
>> public class Foo<BAR>
>> {
>> class InnerFoo { }
>> void method ()
>> {
>> InnerFoo x[]= new InnerFoo[100]; //Doesn't compile
>> }
>> }

Peter Duniho wrote:
> I'd guess the answer to that may actually be specifically addressed in
> the spec too.
>
> But even if not, it seems to me that your example is just a variant on
> the situation that's already being discussed. The above version of the
> code involves a non-reified generic type (Foo<BAR>.InnerFoo), of which
> you can't make an array, and for the same reason as indicated before.
>
> By explicitly choosing the raw type to qualify InnerFoo, you strip the
> generic and thus create a legal array type. Note that while the third
> example compiles, you do get a warning about the need for an unchecked
> conversion. That's only slightly better than it simply not compiling at
> all.

I wonder if a non-inner nested class member would have this trouble. I also
wonder if
InnerFoo x[] = new this.InnerFoo [100];
or something along those line would work.

I'll try that later myself, along with variations for a local class (which I
expect not to). One wonders about inner classes in a static context, albeit
less so.

I've been shot down in this forum before for he suggestioon that an
inner-class definition belongs to a particular enclosing-class instance (as
opposed to the inner-class *instance* belonging to an instance), and there
definitely are limits to that mental model, but it works out to be a handy way
to look at things most times.

--
Lew
From: Lew on
Lew wrote:
> I wonder if a non-inner nested class member would have this trouble.
>

Nope.

> I also wonder if
>    InnerFoo x[] = new this.InnerFoo [100];
> or something along those line would work.
>

Nope.

> I'll try that later myself, along with variations for a local class (which I
> expect not to).  
>

Local classes in an instance method also complain about an attempt to
instantiate a generified array.

Peter is correct. The error with instantiating an array for any
instance-level inner class in a generic containing class is that one
cannot instantiate an array of a non-reifiable type.

--
Lew