LAMBDA不起作用在WebSocket的会议
问题描述:
我只是遇到了一个奇特的小问题:LAMBDA不起作用在WebSocket的会议
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);
}
有谁知道为什么lambda表达式不会在这种情况下工作吗?有没有编译错误,也不例外,什么都没有。该方法'的onMessage'只是不叫。
我使用Java 1.8.0_65和泰鲁斯参考实现1.9。
答
请参阅https://blogs.oracle.com/PavelBucek/entry/websocket_api_1_1_released
tldr;你必须使用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);
为了使用lambda表达式作为消息左撇子。
答
从我的理解MessageHandler
将需要是@FunctionalInterface
允许lambda表达式在这里,情况并非如此。
[“然而,编译器将治疗会议功能接口的定义作为一个功能接口不管一个FunctionalInterface注释是否存在于接口声明任何接口。”](https://docs.oracle。 COM/JavaSE的/ 8 /文档/ API/JAVA/LANG/FunctionalInterface.html) 你不需要注释使用它作为拉姆达 –
而且会有一个编译错误,如果是这样的话。 –