MethodHandles.filterArguments() 例子给出了异常
MethodHandles.filterArguments() example gives an exception
使用 Java 1.8.0_92
,在尝试 运行 MethodHandles.filterArguments() 示例时,抛出以下异常:
Exception in thread "main" java.lang.invoke.WrongMethodTypeException: expected (String,String)String but found (String,String)Object
at java.lang.invoke.Invokers.newWrongMethodTypeException(Invokers.java:298)
at java.lang.invoke.Invokers.checkExactType(Invokers.java:309)
at SomeTest.main(SomeTest.java:15)
密码是:
import static java.lang.invoke.MethodHandles.filterArguments;
import static java.lang.invoke.MethodHandles.lookup;
import static java.lang.invoke.MethodType.methodType;
import java.lang.invoke.MethodHandle;
public class SomeTest {
public static void main(String[] args) throws Throwable {
MethodHandle cat = lookup().findVirtual(String.class,
"concat", methodType(String.class, String.class));
MethodHandle upcase = lookup().findVirtual(String.class,
"toUpperCase", methodType(String.class));
System.out.println(cat.invokeExact("x", "y"));
MethodHandle f0 = filterArguments(cat, 0, upcase);
System.out.println(f0.invokeExact("x", "y")); // Xy
MethodHandle f1 = filterArguments(cat, 1, upcase);
System.out.println(f1.invokeExact("x", "y")); // xY
MethodHandle f2 = filterArguments(cat, 0, upcase, upcase);
System.out.println(f2.invokeExact("x", "y")); // XY
}
}
知道哪里出了问题吗?
你可以在这里使用invoke()
代替invokeExact()
,如果你使用invokeExact()
,你应该给结果类型加上强制转换,比如(String) invokeExact()
.
使用 Java 1.8.0_92
,在尝试 运行 MethodHandles.filterArguments() 示例时,抛出以下异常:
Exception in thread "main" java.lang.invoke.WrongMethodTypeException: expected (String,String)String but found (String,String)Object
at java.lang.invoke.Invokers.newWrongMethodTypeException(Invokers.java:298)
at java.lang.invoke.Invokers.checkExactType(Invokers.java:309)
at SomeTest.main(SomeTest.java:15)
密码是:
import static java.lang.invoke.MethodHandles.filterArguments;
import static java.lang.invoke.MethodHandles.lookup;
import static java.lang.invoke.MethodType.methodType;
import java.lang.invoke.MethodHandle;
public class SomeTest {
public static void main(String[] args) throws Throwable {
MethodHandle cat = lookup().findVirtual(String.class,
"concat", methodType(String.class, String.class));
MethodHandle upcase = lookup().findVirtual(String.class,
"toUpperCase", methodType(String.class));
System.out.println(cat.invokeExact("x", "y"));
MethodHandle f0 = filterArguments(cat, 0, upcase);
System.out.println(f0.invokeExact("x", "y")); // Xy
MethodHandle f1 = filterArguments(cat, 1, upcase);
System.out.println(f1.invokeExact("x", "y")); // xY
MethodHandle f2 = filterArguments(cat, 0, upcase, upcase);
System.out.println(f2.invokeExact("x", "y")); // XY
}
}
知道哪里出了问题吗?
你可以在这里使用invoke()
代替invokeExact()
,如果你使用invokeExact()
,你应该给结果类型加上强制转换,比如(String) invokeExact()
.