Typed Method handles
Rémi Forax
forax at univ-mlv.fr
Thu Jun 9 07:59:39 PDT 2011
On 06/09/2011 04:46 PM, Ali Ebrahimi wrote:
> Hi Remi,
>
> On Thu, Jun 9, 2011 at 5:59 PM, Rémi Forax <forax at univ-mlv.fr
> <mailto:forax at univ-mlv.fr>> wrote:
>
> On 06/09/2011 04:11 PM, Ali Ebrahimi wrote:
> > Hi Remi,
> >
> >
> > On Thu, Jun 9, 2011 at 4:49 PM, Rémi Forax<forax at univ-mlv.fr
> <mailto:forax at univ-mlv.fr>> wrote:
> >
> >> On 06/09/2011 12:33 PM, Ali Ebrahimi wrote:
> >>
> >> Hi Remi,
> >> comments inlined.
> >>
> >> On Thu, Jun 9, 2011 at 1:49 PM, Rémi Forax<forax at univ-mlv.fr
> <mailto:forax at univ-mlv.fr>> wrote:
> >>
> >>> On 06/09/2011 11:55 AM, Ali Ebrahimi wrote:
> >>>> Hi all,
> >>>> What happens if method handles takes variable arty of generic
> type
> >>>> parameters.
> >>>>
> >>>> MethodHandle<void,int> mh = #{x -> System.out.println(x);};
> >>>>
> >>>> mh.invokeExack(1); //compiles
> >>>>
> >>>> mh.invokeExack("1"); //compile fail
> >>> I've proposed this syntax last year or before.
> >>> There are 2 problems:
> >>> - it's a function type, so this means to introduce a new
> kind of type
> >>> in the Java type system.
> >>> - it allows to use void and the primitives types between the
> angle
> >>> bracket
> >>> which is not something allowed for the generics syntax.
> >>>
> >> This is not so hard. Method handles are new phenoms to platform and
> >> compiler can handle them specially as polymorphic signature method
> >> invocations handed.
> >>
> >> Best Regards,
> >> Ali Ebrahimi
> >>
> >> So this syntax was rejected for Java 8 but may be
> reconsidered later.
> >>> Rémi
> >>>
> >> I think I know what a method handle is.
> >> Polymorphic signature method like MH.invoke or MH.invokeGeneric
> are handled
> >> by bypassing the method resolution used by the compiler.
> >> That's why you have to specify the return type when calling
> such methods.
> >> To summarize, the compiler does nothing and let the VM checks
> at runtime if
> >> the invocation is safe or not.
> >>
> >> So you can't reuse this mechanism to implement function type.
> >>
> > I don't mean reuse the same mechanism, my intent is specially
> applying of
> > generic type parameters for MethodHandle reference types and
> allowing them
> > take arbitrary number of type parameters in declaration.
> > In this case, the compiler does not check number and types of
> them and
> > accept them as is and use them for checking of methodhandle
> invocation
> > expresions .
> >
> > MethodHandle<void,int> mh1;
> > MethodHandle<void,int,int> mh2;
> > MethodHandle mh;
> > ...
> > mh1.invoke(1);
> > mh2.invoke(1,2);
> >
> > for generic MethodHandle reference as mh1, mh2 compiler checks
> applicability
> > of passed args in methodhandle invocation expresions and for
> non-generic
> > once as mh don't do this check and works as current mechanism.
> > mh.invoke(1,2,3,4);
> >
> > MethodHandle class itself does not any generic type parameters in
> > definition.
>
> But you just scratch the surface.
> What about sybtyping between MethodHandle function type,
> is a MethodHandle function type is a reified type,
> is wildcard of MethodHandle function type allowed, is capture allowed,
> is a MethodHandle function type can be inferred (what are the rules
> for such inference), etc ?
>
> I think, this idea is in raw state and each of the above cases should
> be investigated. At first some of them can be supported. But any
> solution must be possible forward compatible to kill the rest of the
> battle.
>
> What do you think?
[me trying to remember some shower session about that]
I think you first need reification of generics if you want to be sure to
don't introduce hazard.
After, you just have to create a JSR :)
>
> Best Regards,
> Ali Ebrahimi
>
regards,
Rémi
More information about the lambda-dev
mailing list