On Wed, 31 May 2023 03:43:25 GMT, Chen Liang <li...@openjdk.org> wrote:

>> test/jdk/java/lang/invoke/findVirtual/FindVirtualArrayCloneTest.java line 70:
>> 
>>> 68:         var cloneMh = MethodHandles.lookup()
>>> 69:                 .findVirtual(String[].class, "clone", 
>>> MethodType.methodType(Object.class));
>>> 70:         var mhClone = (String[]) (Object) 
>>> cloneMh.invokeExact((String[]) array);
>> 
>> Suggestion:
>> 
>>         var mhClone = (String[]) cloneMh.invokeExact((String[]) array);
>
> the clone Method handle will have a type of `(String[])Object`, as 
> `findVirtual` for `clone` uses the Object return method type, and there is no 
> covariant override in array classes (which don't declare any methods)

You're right.  Alternatively (perhaps easier to read):


-                .findVirtual(String[].class, "clone", 
MethodType.methodType(Object.class));
-        var mhClone = (String[]) (Object) cloneMh.invokeExact((String[]) 
array);
+                .findVirtual(String[].class, "clone", 
MethodType.methodType(Object.class))
+                .asType(MethodType.methodType(String[].class, String[].class));
+        var mhClone = (String[]) cloneMh.invokeExact((String[]) array);

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13855#discussion_r1211064561

Reply via email to