Lambda expression as a succinct way to pass in type parameter
Rémi Forax
forax at univ-mlv.fr
Mon Nov 14 09:47:49 PST 2011
On 11/14/2011 06:29 PM, Zhong Yu wrote:
> Hi Brian, I think I have an interesting use case, but I need your
> confirming that it's viable. Consider a method
>
> <T> T foo() {...}
>
> Suppose the body of foo() needs to know the runtime value of T, due to
> erasure, we must pass in a construct containing the value of T
>
> <T> T foo(TypeToken<T> type) {...}
>
> interface TypeToken<T>
> {
> int f(int x); // not really used
> }
>
> We can call foo() this way
>
> Bar result = foo(x->x);
>
> The lambda expression x->x is compiled into an object of
> TypeToken<Bar>, and the body of foo() can use reflection to retrieve
> T=Bar.
>
> // equivalent code
> Bar result = foo(type);
>
> static TypeToken<Bar> type = new TypeToken<Bar>(){ public int
> f(int x){ return x; } }
>
> Question: do you see anything wrong with this usage pattern? (other
> than how odd it looks)
>
> cheers,
> Zhong Yu
>
Interesting pattern but ...
This may not work because at runtime the reflection will return a class
that doesn't implements TypeToken<Bar> but TypeToken
because a lambda implementation may try to reuse the same class for
several TypeToken.
The idea is that the class that implements TypeToken will not be
generated by the compiler
but by the VM at runtime to avoid to generate boilerplate bytecodes on disc
so the generation will occur after the erasure so Bar information will
be lost.
Rémi
More information about the lambda-dev
mailing list