gpt4 book ai didi

java - MethodHandle 示例在调用 invokeExact 时抛出 WrongMethodTypeException

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:17 24 4
gpt4 key购买 nike

MethodHandle 类的描述中显示的示例在语句 mh.invokeExact("daddy",'d' ,'n') 带有以下描述:(CC)Ljava/lang/String;不能使用与 ([Ljava/lang/Object;)Ljava/lang/Object; 不同的参数调用。

MethodHandle 对象 mh 有一个符号类型描述符对应于:(CC)Ljava/lang/String。但是当我们调用 mh.invokeExact("daddy",'d','n') 时,参数:dn 是作为 Object 数组传递,然后它们与 char 类型的参数不匹配。

我知道我可以使用 invokeWithArguments 而不是 invokeExcatinvoke 来解决上述问题,但是这个例子应该按照 Java 7 API 的 MethodHandle 的描述进行工作。除此之外,invokeWithArguments 相对于 invoke/invokeExact 有性能开销。

最佳答案

你是如何编译这个的?

对我来说,这听起来像是一个已知的 Eclipse 错误。

我刚刚检查了 javac 和这段代码:

import java.lang.invoke.*;

public class ScratchMH {
private static ScratchMH instance = null;

public ScratchMH() {
super();
}

private void run() throws Throwable {
Object x, y; String s; int i;
MethodType mt; MethodHandle mh;
MethodHandles.Lookup lookup = MethodHandles.lookup();

// mt is (char,char)String
mt = MethodType.methodType(String.class, char.class, char.class);
mh = lookup.findVirtual(String.class, "replace", mt);
s = (String) mh.invokeExact("daddy",'d','n');
// invokeExact(Ljava/lang/String;CC)Ljava/lang/String;

System.out.println(s);
}

public static void main(String[] args) throws Throwable {
instance = new ScratchMH();
instance.run();
}
}

似乎工作正常:

ariel-2:src boxcat$ javac scratch/clj/ScratchMH.java 
ariel-2:src boxcat$ java scratch/clj/ScratchMH
nanny
ariel-2:src boxcat$

javap 输出的相关部分似乎也很正常:

  35: invokevirtual #8                  // Method java/lang/invoke/MethodHandles$Lookup.findVirtual:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
38: astore 6
40: aload 6
42: ldc #9 // String daddy
44: bipush 100
46: bipush 110
48: invokevirtual #10 // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;CC)Ljava/lang/String;
51: astore_3

关于java - MethodHandle 示例在调用 invokeExact 时抛出 WrongMethodTypeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8803115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com