我正在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
是否接受String?在我看来,这真的很奇怪,我们可以仅将Whole
和Override onMessage
子类化,这将是一个不同的类。然后我们可以将类型参数传递给addMessageHandler
,对吗?但是在这里,我们只是覆盖它,并在此同时指定type参数,对吧?编辑
所以我了解到MessageHandler是一个带有两个嵌套接口的接口
MessageHandler.Whole<T>
和MessageHandler.Partial<T>
现在,我们将类型为
MessageHandler
的对象传递到方法addMessageHandler
中,它怎么知道该对象实现了onMessage
方法。不应该知道,因为此方法位于嵌套接口Whole
中。 最佳答案
整体是普通的内部阶级吗?
不。这是一个通用的嵌套类(确切地说是接口),如the javadoc所示。术语“内部”用于非静态嵌套类,它们隐式引用了其所属类的实例。请参见the tutorial。
并且由于我们将String指定为类型参数,因此onMessage是否接受String?
正确,如the javadoc所示。
我们可以将Whole子类化,并覆盖onMessage,那将是一个不同的类
这正是这段代码的作用。它创建并实例化一个匿名子类os Whole。
现在我们将类型为MessageHandler的对象传递到方法addMessageHandler中,怎么知道该对象实现了onMessage方法。不应该知道,因为此方法位于嵌套接口Whole中。
作为javadoc shows,接口Whole
扩展了接口MessageHandler
。这就是为什么您可以将Whole传递给需要MessageHandler的方法(就像您可以将Banana传递给需要Fruit的方法一样,因为Banana是Fruit)。