2016-08-24 3 views
1

Ich habe einen ProxyGenerator, der wie der untenstehende aussieht. Mein Problem ist jetzt, dass ich nicht weiß, welche Art dies:Java-8 Lambda-Ausdruck - Funktionsschnittstelle Typ

Consumer<...?????> myConsumer = (proxy, method, args) -> method.invoke(realSubject, args); 

Consumer falsch ist, gibt es eine einfache Art und Weise, welche Art bestimmt von dem Lambda-Ausdruck ist (zum Beispiel mit Eclipse)?

public class ProxyGenerator { 

    public static <P> P makeProxy(Class<P> subject, P realSubject) { 

     Consumer<Subject_A> myConsumer = (proxy, method, args) -> method.invoke(realSubject, args); 

     final Object proxyInstance = Proxy.newProxyInstance(subject.getClassLoader(), new Class<?>[] { subject }, 
      (proxy, method, args) -> method.invoke(realSubject, args)); 
     return subject.cast(proxyInstance); 
    } 
} 
+0

Welche Art zu sein braucht es noch? 'myConsumer' wird nirgendwo in Ihrem Beispiel verwendet. – zeroflagL

Antwort

3

in Eclipse, können Sie einfach den Mauszeiger bewegen, auf das „->“ Symbol: den Tooltip, die vollständige Methodensignatur für das implementierten Lambda gezeigt werden muss. In Ihrem Fall ist die implementierte Methode einfach InvocationHandler.invoke Methode.

Also, Code deklariert und mit myConsumer stattdessen als deklariert werden soll:

final InvocationHandler myHandler = (proxy, method, args) -> method.invoke(realSubject, args); 
final Object proxyInstance = Proxy.newProxyInstance(subject.getClassLoader(), new Class<? >[] { subject }, myHandler); 

Beachten Sie, dass Consumer, während eine sehr nützliche Schnittstelle für „Capturing“ ist auf einmal alle Lambdas ein Argument ohne Ergebnis raubend ist nur das. Wenn Ihr Lambda nicht zu diesem Modell passt, können Sie es nicht als Consumer deklarieren; insbesondere kann Ihr Lambda nicht Consumer ‚s accept Methode passen, da sie hat:

  • drei Argumente statt einem
  • ein Ergebnis, statt Hohlraum