[jsr-292-eg] Conversion of method reference to MethodHandle
Jochen Theodorou
blackdrag at gmx.org
Mon Dec 31 04:16:02 PST 2012
Am 31.12.2012 01:42, schrieb Remi Forax:
[...]
> For the semantics:
> Unlike the method reference with a functional interface, only
> unbunded method reference are allowed, so by example,
> a method reference starting with an expression or super are not valid.
> Moreover, because there is no type information that the compiler can
> extract from a MethodHandle, the semantics in case of several
> overloading methods, i.e. several applicable methods is simple, it's an
> ambiguity and is rejected by the compiler.
> More formally, a method reference can be converted to a
> j.l.i.MethodHandle,
> - only if it's form is
> Type::name, with Type an existing type and name a valid Java
> identifier or 'new'.
> - then from the type, the compiler gather all accessible methods
> declared in the type type or it's super type (class or interfaces),
> if a method is override-equivalent to another one, the one from
> the supertype is discarded.
> if the name is 'new', the compiler gather all constructors of the
> type type.
> if the type is an array, all public methods of j.l;Object are
> available plus clone()
> - if there are more than one method in the set of gathered method,
> the reference is ambiguous.
> - if there is no method, the reference is not available
> - if there is one method, a method handle will be created from this
> method.
I think not allowing overloaded methods will restrict the usage quite a
lot. You say this should be able to reference constructors, but having
more than one constructor is a very common thing. Also you don't specify
visibility. what if for example there are two X::foo, but one is private
the other not? does it still count as overloaded? Will we be allowed to
call the other? Since you talk of simplified method selection logic I
would assume it is not seen as overloaded, if the private method is not
visible. That would at least in same cases save the usage for this. But
I still think you should be able to give the parameter types. Actually
being able to give the return type too would be even better for
languages that are not Java. X:foo could be a short form if there is no
overloading... or is x:foo(String) difficult to implement?
bye Jochen
--
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org
More information about the lambda-spec-experts
mailing list