Introduce a compiler option to store generic type information about a lambda expression using the Signature Attribute
Remi Forax
forax at univ-mlv.fr
Wed Jan 7 16:21:17 UTC 2015
We (the lambda EG) discusses that issue last year,
as far as I remember, it was decided to not support generic signature in
lambda proxy by default,
now I see no problem to make this information accessible through a flag.
cheers,
Rémi
On 01/07/2015 04:47 PM, Maurizio Cimadamore wrote:
> Hi Timo,
> thanks for the patch - if I'm not mistaken, this would be the very
> first case in which a method marked with ACC_SYNTHETIC also gets a
> signature attribute. I will consult with the rest of the team and see
> if there's any objection.
>
> Cheers
> Maurizio
>
> On 07/01/15 15:22, Timo Walther wrote:
>> Hi all,
>>
>> the Java Reflection API allows to access the generic signature of
>> methods through the java.lang.reflect.Method#getGenericReturnType()
>> method. However, this is not yet supported for Lambda expressions.
>>
>> Given the following classes:
>>
>> class Tuple2<F0,F1> {
>> F0 field0;
>> F1 field1;
>>
>> public Tuple2(F0 f0, F1 f1) {
>> this.field0 = f0;
>> this.field1 = f1;
>> }
>> }
>>
>> interface Map<IN, OUT> {
>> OUT map(IN in);
>> }
>>
>> Currently, there is no solution that allows to get further type
>> information about expressions like:
>>
>> Map<String, Tuple2<String, Integer>> map = (str) -> new Tuple2<>(str,
>> 1);
>> System.out.println(getReturnType(map)) // can only print Tuple2 =>
>> information about the Tuple2's fields are always lost
>>
>> Especially data-intensive runtimes (like Apache Flink[0] where I am
>> working on) need as much type information as possible to be
>> efficient. Therefore, we searched for a way to also extract type
>> information from lambda expressions. Adding a generic signature to
>> the generated "lambda$XXX" static methods (at least by using a
>> compiler option) would be the perfect solution. It seems that the JVM
>> Specification does not prohibit such an implementation. An
>> implementation of a later extraction is described here[1].
>>
>> The Eclipse JDT compiler team is introducing a compiler option
>> "-genericsignature" with version 4.5 M4[2].
>>
>> I have implemented a patch prototype. It can be found at:
>> http://people.apache.org/~twalthr/patches/lambdaSignature.patch
>>
>> The patch postpones the type erasure of the lambda function's
>> parameters after the generic descriptor has been saved in a newly
>> introduced variable in MethodSymbol (if compiler option
>> "-lambdasignature" is set). The contents of the variable is read in
>> ClassWriter and written to method's Signature attribute in the
>> classfile. Tests are also included.
>>
>> No change to the class file format is required. The change is guarded
>> by a compiler option, so without that addition, nothing should behave
>> differently.
>>
>>
>> [0] http://flink.apache.org/
>> [1]
>> http://stackoverflow.com/questions/21887358/reflection-type-inference-on-java-8-lambdas
>> [2] https://bugs.eclipse.org/bugs/show_bug.cgi?id=449063
>>
>>
>> Regards,
>> Timo Walther
>
More information about the compiler-dev
mailing list