Effective finality requirements for method reference receiver ?

Dan Smith daniel.smith at oracle.com
Thu Feb 14 09:12:43 PST 2013


On Feb 13, 2013, at 9:41 PM, Srikanth S Adayapalam <srikanth_sankaran at in.ibm.com> wrote:

> Are there any ? 
> 
> 0.6.1 - Part C is silent. The words final and capture don't occur there. 
> But SOTL 4th edition talks about the implicit lambda capturing a variable 
> and using that as the receiver. Spec should override all other prose - right ? 
> I also see that the mention of implicit lambda is from a pedagogical pov. 

Here's the relevant spec, from Part E, 15.28.2:

"If the method reference begins with an ExpressionName or a Primary, the target reference of the invocation is the value of this expression, as determined _at the time_ the method reference was evaluated, and the parameters of the invocation are the parameters of the synthetic method."

The intuition is that "Func f = expr::foo;" is translated into something like this:

final Foo receiver = expr;
Func f = (x, y) -> receiver.foo(x, y);

(Hard to actually do such a translation in general, though, since you can't put variable declarations in the middle of an expression.)

> BTW, 0.6.1 Part B links to SOTL edition 3 - which is very outdated with respect 
> to the present state of affairs. 

Thanks.  I'll fix that.

—Dan

> I see that javac 8b74 compiles this code fine: 
> 
> // -- 
> interface I { 
>         void foo(); 
> } 
> 
> public class X { 
>         private void foo() { 
>                 X x = new X(); 
>                 x = new X(); 
>                 I i = x::foo; 
>         } 
> } 
>   
> Thanks in advance for any clarifications. 
> Srikanth.



More information about the lambda-spec-experts mailing list