hg: lambda/lambda/langtools: Added basic support for constructor references.

Brian Goetz brian.goetz at oracle.com
Mon Jan 17 11:29:09 PST 2011

That is the most likely suspect.  Which would then want that the type of 
a method reference be jlr.Method, which is problematic because Lambda 
wants method references to be SAM-converted (just as lambda expressions 
are.)  At which point I say "ugh, how did we get here?" and start 
looking for backtrack paths.

Jumping up a level, this illustrates the dark side of the (almost always 
specious) "consistency" argument**, which in this case goes like:

  - If you have method references, you should have field references, for 
  - The obvious type of a field reference is jlr.Field
  - Therefore for consistency, the type of a method reference should be 
  - We want method references to be SAM-convertible, just like lambdas
  - Since the type of a method reference is jlr.Method, I guess we need 
a conversion from jlr.Method to SAM
  - There have been other requested conversions, e.g., 
lambda-to-MethodHandle.  So for consistency I guess we want a conversion 
from jlr.Method to MethodHandle too?  And back?
  - Cycles in conversions are great feeding grounds for puzzlers.

You see where this goes.  You start pulling on a string, and before you 
know it you have reduced your sweater to a messy lump of string.

**This is not to say that consistency is not good, but the reality is 
that the language is already full of inconsistency and therefore 
consistency can't actually be achieved, and all we can do is choose 
where we want our inconsistencies.  But we can justify nearly any 
feature we happen to want by saying "for consistency!", because you can 
usually find some other feature with which it is consistent.  And 
therefore it is a very weak argument (on its own) for including a 
language feature.

Which brings me back to the original discussion: method references are 
useful for lambda.  Field references, on the other hand, have very 
little contribution to lambda, and also have the major defect that they 
are really a completely different beast from method references, and 
therefore the implicit "member reference" concept (which seems like an 
obvious unifying abstraction) turns out to be a false abstraction.

On 1/17/2011 1:37 PM, Paulo Silveira wrote:
> 2011/1/17 Rémi Forax<forax at univ-mlv.fr>:
>> On 01/17/2011 06:56 PM, Brian Goetz wrote:
>>> If you mean field references, yes, this was already discussed.  It was
>>> decided that this was outside the scope of Lambda.
>>> (question for you to think on: what would the type of a field reference
>>> be?)
>> java.lang.Property but that's another story.
> why not plain old java.lang.reflect.Field if a new property syntax is
> not possible?
> thanks
>> Rémi
>>>> This  has probably  been discussed already, but since there are
>>>> Methods and Constructor references, any chances to have Attribute
>>>> references?
>>>> Paulo
>>>> --
>>>> Paulo Silveira
>>>> Caelum | Ensino e Inovação
>>>> www.caelum.com.br
>>>> www.arquiteturajava.com.br
>>>> 2011/1/17 Rémi Forax<forax at univ-mlv.fr>:
>>>>>     Cool !
>>>>> Rémi
>>>>> Le 17/01/2011 15:36, maurizio.cimadamore at oracle.com a écrit :
>>>>>> Changeset: 9a616df38d88
>>>>>> Author:    mcimadamore
>>>>>> Date:      2011-01-17 14:34 +0000
>>>>>> URL:       http://hg.openjdk.java.net/lambda/lambda/langtools/rev/9a616df38d88
>>>>>> Added basic support for constructor references.
>>>>>> Syntax is as follows:
>>>>>> ClassName [optionalTypeArgs] '#' 'new' [optionalArgs]
>>>>>> Examples:
>>>>>> Foo#new ->       (*)Foo [most specific constructor]
>>>>>> Foo#new() ->       ()Foo
>>>>>> Foo#new("Hello!") ->       (String)Foo
>>>>>> Foo<String>#new("Hello!") ->       (String)Foo<String>
>>>>>> ! src/share/classes/com/sun/tools/javac/comp/Attr.java
>>>>>> ! src/share/classes/com/sun/tools/javac/comp/Lower.java
>>>>>> ! src/share/classes/com/sun/tools/javac/parser/JavacParser.java
>>>>>> + test/tools/javac/lambda/MethodReference17.java
>>>>>> + test/tools/javac/lambda/MethodReference18.java
>>>>>> + test/tools/javac/lambda/MethodReference19.java
>>>>>> + test/tools/javac/lambda/MethodReference20.java
>>>>>> + test/tools/javac/lambda/MethodReference20.out

More information about the lambda-dev mailing list