我正在阅读Java EE中的WebSocket Endpoints并且我正在阅读这个
public class EchoEndpoint extends Endpoint {
@Override
public void onOpen(final Session session, EndpointConfig config) {
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String msg) {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) { ... }
}
});
}
}
这部分,
new MessageHandler.Whole<String>() {....
Whole
是一个通用的内部类吗?因为我们将String指定为类型参数,onMessage
接受字符串?这对我来说看起来很奇怪,我们可以将Whole
和Override onMessage
分类,这将是一个不同的类。然后我们可以将类型参数传递给addMessageHandler
对吗?但是在这里,我们只是重写它并在此同时指定类型参数对吗?
修改
所以我学会了MessageHandler是一个带有两个嵌套接口的接口
MessageHandler.Whole<T>
和
MessageHandler.Partial<T>
现在我们将类型MessageHandler
的对象传递给方法addMessageHandler
,它怎么知道这个对象实现了onMessage
方法。它不应该知道,因为这个方法在嵌套接口Whole
中。
答案 0 :(得分:1)
整个是一个通用的内部类吗?
没有。它是一个通用的嵌套类(界面,确切地说),如the javadoc所示。术语“内部”用于非静态嵌套类,它隐式地具有对其拥有类的实例的引用。请参阅the tutorial。
由于我们将String指定为类型参数,onMessage接受字符串?
正确,如the javadoc所示。
我们可以将Whole和Override onMessage子类化,这将是一个不同的类
这正是这段代码的作用。它创建并实例化一个匿名子类os Whole。
现在我们将MessageHandler类型的对象传递给方法addMessageHandler,它怎么知道这个对象实现了onMessage方法。它不应该知道,因为这个方法是嵌套接口Whole。
作为javadoc shows,接口Whole
会使用接口MessageHandler
。这就是为什么你可以将Whole传递给一个期望MessageHandler的方法(就像你可以将Banana传递给期望Fruit的方法一样,因为Banana是一个Fruit)。