Function types versus arrays
Joshua Bloch
jjb at google.com
Wed Feb 17 23:26:55 PST 2010
Neal,
Thanks. This example makes the problem clear.
Josh
On Wed, Feb 17, 2010 at 9:56 PM, Neal Gafter <neal at gafter.com> wrote:
> On Wed, Feb 17, 2010 at 6:56 PM, Joshua Bloch <jjb at google.com> wrote:
> > Actually this is a bit too formal/abstract for my tastes. Show me some
> code
> > that would break. I'm looking for something along the lines of the "Why
> > generic array creation is illegal" example on page 120 of Effective Java
> > (Second Ed.). (I believe it was you who first showed me this example.)
>
> Since reification of function types is visible by its effect in arrays
> (project lambda hasn't yet described the reflective APIs), we can
> illustrate the problem this way:
>
> class Ex {
> static #String()[] array = new #String()[1];
> static Object[] objectArray = array;
> static <T> void impossible() {
> final T t = null;
> objectArray[0] = #()(t); // assign a function of type #T()
> into objectArray
> }
> }
>
> Now, if we call Ex.<String>impossible(), the code should run without
> problems (the lambda inside is of type #String()).
>
> If we call Ex.<Integer>impossible(), the code must throw an array
> store exception (the lambda inside is of type #Integer()).
>
> Both calls must generate the exact same bytecode due to erasure of
> generics and the existing binary compatibility rules.
>
> Since the same code must behave differently at runtime due to
> information that is unavailable at runtime, we have a logical
> contradiction.
>
More information about the lambda-dev
mailing list