我正在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)。

10-04 10:08