2016-06-08 7 views
0

Mit Java 1.8.0_92, bei dem Versuch, das Beispiel MethodHandles auszuführen. filterArguments(), wird die folgende Ausnahme ausgelöst:MethodHandles.filterArguments() Beispiel gibt eine Ausnahme

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) 

Der Code ist:

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 
    } 
} 

Jede Idee, was falsch ist?

+1

Einige Informationen aus doc über invokeExact: Ruft das Methoden-Handle auf, das alle Deskriptoren des Aufrufertyps zulässt, aber eine genaue Typübereinstimmung erfordert. * Der symbolische Typdeskriptor an der Aufrufsite von {@code invokeExact} muss * genau mit dem {@link #Typ type} dieser Methodenkennung übereinstimmen. * Bei Argumenten oder Rückgabewerten sind keine Konvertierungen erlaubt. – star

Antwort

1

Sie können invoke() statt invokeExact() hier verwenden, wenn Sie invokeExact() verwenden, sollten Sie insg Typ zu führen, wie (String) invokeExact().

Verwandte Themen