Problem with Method Reference

Howard Lovatt howard.lovatt at gmail.com
Mon Aug 23 02:19:17 PDT 2010


Yes, I was wrong it is a bug

  -- Howard Lovatt +61 419 971 263 (sent from my PDA)

On 23/08/2010, at 6:12 PM, Maurizio Cimadamore <maurizio.cimadamore at oracle.com> wrote:

> On 23/08/10 02:03, Howard Lovatt wrote:
>> Hi,
>> 
>> I think the following should not compile (because
>> String.CASE_INSENSITIVE_ORDER isn't a class but an object):
>> 
>>   final String s1 = "Amy";
>>   final String s2 = "Bec";
>>   final String[] people = new String[] { s2, s1 };
>>   Arrays.sort( people, String.CASE_INSENSITIVE_ORDER#compare( String,
>> String ) );
>>   
> I don't agree... the above code is not different w.r.t. to
> 
> new Foo()#bar
> 
> which should compile. The left hand side of an infix # operator can be either an expression or a qualified type.
>> but it does. However when run, you get:
>> 
>> Exception in thread "main" java.dyn.WrongMethodTypeException:
>> (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
>> cannot be called as
>> (Ljava/dyn/MethodHandle;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
>>    at java.dyn.MethodHandle.invokeVarargs(MethodHandle.java:330)
>>    at com.sun.runtime.ProxyHelper$1.invoke(ProxyHelper.java:57)
>>    at $Proxy0.compare(Unknown Source)
>>    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:324)
>>    at java.util.TimSort.sort(TimSort.java:189)
>>    at java.util.TimSort.sort(TimSort.java:173)
>>    at java.util.Arrays.sort(Arrays.java:653)
>>    at lambdas.Main.lambdas(Main.java:67)
>>    at lambdas.Main.main(Main.java:19)
>>   
> What happens here is that javac thinks (erroneously) that this is a static qualifier when it's not - as such it does not prepend the 'this' argument in the method call... (which is a bug)
> 
> Maurizio
>> 
>>   -- Howard.
>> 
>> PS Full source, as requested previously, to follow
>>   
> 


More information about the lambda-dev mailing list