通用匿名内部类实例

时间:2018-04-13 05:46:18

标签: java generics

我正在阅读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中。

1 个答案:

答案 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)。