problem with vargs method
Jochen Theodorou
blackdrag at gmx.org
Tue Feb 7 09:17:52 PST 2012
That will produce a
java.lang.invoke.WrongMethodTypeException:
(Ljava/lang/Object;[Ljava/lang/Object;)V cannot be called without a
receiver argument as ([Ljava/lang/Object;)Ljava/lang/Object;
imho casting to Object and Object[] in
mh.invokeExact((Object)Class.class, (Object[])new Class[0]);
is without effect, since invokeExact is a vargs method an everything
will just be put into an Object[] anyway. We had not a compiler change
for this kind of thing, had we?
bye Jochen
Am 07.02.2012 17:52, schrieb Jim Laskey:
> Try
>
> MethodType type = MethodType.methodType(Constructor.class, Class[].class);
> MethodHandle mh = MethodHandles.lookup().findVirtual(Class.class, "getDeclaredConstructor", type);
> MethodType target = MethodType.methodType(void.class, Object.class, Object[].class);
> mh = MethodHandles.explicitCastArguments(mh, target);
> mh.invokeExact((Object)Class.class, (Object[])new Class[0]);
>
> Cheers,
>
> -- Jim
>
> On 2012-02-07, at 12:37 PM, Jochen Theodorou wrote:
>
>> Am 07.02.2012 17:29, schrieb Jim Laskey:
>>>>>> MethodType type = MethodType.methodType(Constructor.class, Class[].class);
>>>>>> MethodHandle mh = MethodHandles.lookup().findVirtual(Class.class, "getDeclaredConstructor", type);
>>>>>> MethodType target = MethodType.methodType(Object.class, Object.class, Object.class);
>>>>>> mh = mh.asType(target);
>>>>>> mh.invokeWithArguments(Class.class,new Class[0]);
>>>
>>> As soon as you mh = mh.asType(target); it is no longer vararg, so it
>>> is treating new Class[0] as the second argument cast to Object. If
>>> you are trying to type as (Object , Object[]). I think you are going
>>> to run into difficulties validating (Class[]) Object[]. You may have
>>> to add a wrapper to get what you want, but you could also try using
>>> asCollector.
>>
>> or in other words: I should not use invokeWithArguments for this.
>>
>> If I wanted to use the same target type... since that is what my call site gives me... and I wanted to use invokeExact instead, how would I have to change the program?
>>
>> bye blackdrag
>>
>> --
>> 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
>>
>
--
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 mlvm-dev
mailing list