2016-02-29 15 views
5

begegnete ich nur ein eigentümliches kleines Problem:Lambda funktioniert nicht

javax.websocket.Session session = //... 
// this works 
newSession.addMessageHandler(new MessageHandler.Whole<String>() { 

    @Override 
    public void onMessage(String message) { 
     MyWebSocket.this.onMessage(message); 
    } 
}); 
// these don't work 
newSession.addMessageHandler((MessageHandler.Whole<String>) MyWebSocket.this::onMessage); 
newSession.addMessageHandler((MessageHandler.Whole<String>) message -> MyWebSocket.this.onMessage(message)); 


void onMessage(String message) { 
    System.out.println(message); 
} 

Weiß jemand, warum Lambda-Ausdrücke werden in diesem Fall nicht funktionieren? Es gibt keine Kompilierung-Fehler, keine Ausnahme, kein gar nichts. Die Methode ‚‘ onMessage ‚‘ ist einfach nicht genannt.

verwende ich Java 1.8.0_65 und die Tyrus Referenzimplementierung 1.9.

Antwort

2

bitte https://blogs.oracle.com/PavelBucek/entry/websocket_api_1_1_released

TLDR sehen; Sie haben Session#addMessageHandler(Class<T> clazz, MessageHandler.Whole<T> handler)

/** 
* Register to handle to incoming messages in this conversation. A maximum of one message handler per 
* native websocket message type (text, binary, pong) may be added to each Session. I.e. a maximum 
* of one message handler to handle incoming text messages a maximum of one message handler for 
* handling incoming binary messages, and a maximum of one for handling incoming pong 
* messages. For further details of which message handlers handle which of the native websocket 
* message types please see {@link MessageHandler.Whole} and {@link MessageHandler.Partial}. 
* Adding more than one of any one type will result in a runtime exception. 
* 
* @param clazz type of the message processed by message handler to be registered. 
* @param handler whole message handler to be added. 
* @throws IllegalStateException if there is already a MessageHandler registered for the same native 
*        websocket message type as this handler. 
*/ 
public void addMessageHandler(Class<T> clazz, MessageHandler.Whole<T> handler); 

zu verwenden, um Lambdas als Nachricht handers zu verwenden.

-2

Von meinem Verständnis MessageHandler müsste ein @FunctionalInterface sein, um Lambda-Ausdrücke hier zu erlauben, was nicht der Fall ist.

+1

[ „Allerdings wird der Compiler jede Schnittstelle als eine funktionale Schnittstelle unabhängig davon, entsprechend der Definition einer funktionellen Schnittstelle behandeln, ob eine FunctionalInterface Anmerkung auf der Interface-Deklaration vorhanden ist.“] (Https://docs.oracle. com/JavaSE/8/docs/api/java/lang/FunctionalInterface.html) Sie die Annotation nicht brauchen –

+1

es einen Compiler-Fehler wäre es auch als Lambda zu verwenden, wenn das der Fall war. –