2016-06-08 107 views
0

用Java 1.8.0_92試圖運行MethodHandles的例子。 filterArguments(),下面的異常被拋出: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 
    } 
} 

任何想法有什麼不好?

+1

doc關於invokeExact的一些信息:調用方法句柄,允許任何調用者類型描述符,但需要精確的類型匹配。 *調用網站{@code invokeExact}的符號類型描述符必須與此方法句柄的{@link #type type}完全匹配。 *參數或返回值不允許轉換。 – star

回答

1

如果您使用invokeExact(),則可以使用invoke()而不是invokeExact(),您應該將結果類型添加到結果類型,如(String) invokeExact()

相關問題