在GWT中,为什么方法不能返回接口?

时间:2011-05-19 13:13:46

标签: gwt

this video from Google IO 2009中,演示者很快就会说方法的签名应该返回具体类型而不是接口。

根据我在视频中看到的内容,这与GWT Java-to-Javascript编译器有关。

  • 这个选择背后的原因是什么?
  • 方法签名中的接口对编译器有什么作用?
  • 哪些方法可以返回接口而不是具体类型,哪些方法最好返回具体实例?

Snippet of code from Google IO presentation showing it's better that your method returns ArrayList than List

2 个答案:

答案 0 :(得分:16)

正如你所说,这与gwt编译器有关。 编辑:但是,正如Daniel在下面的评论中指出的那样,这通常不适用于gwt编译器,只有在使用GWT-RPC时才适用。

如果声明List而不是ArrayList作为返回类型,gwt-compiler将在编译的代码中包含完整的List-hierarchy(即所有实现List的类型)。如果使用ArrayList,编译器只需要包含ArrayList层次结构(即实现ArrayList的所有类型 - 通常只是ArrayList本身)。使用接口而不是具体类,您将在编译时间和生成代码的大小(以及每个用户在运行应用程序时必须下载的代码量)方面付出代价。

您还要问原因:如果您使用接口(而不是具体类),编译器在编译时不知道将使用这些接口的哪些实现。因此,它包括所有可能的实现。

关于你的上一个问题:所有方法都可以声明为返回接口(这就是你的意思,对吧?)。但是,上述罚款适用。

顺便说一下:据我了解,这个问题不仅限于方法。它适用于所有类型声明:变量,参数。每当您使用接口声明某些内容时,编译器将包含子接口的完整层次结构和实现类。 (很明显,如果你只用一两个实现类来声明自己的接口,那么你就不会受到很大的惩罚。这就是我在GWT中使用接口的方式。)

简而言之:尽可能使用具体课程。

(小建议:如果你在引用视频时给出时间戳,会有所帮助。)

答案 1 :(得分:2)

此IO和其他效果提示已在Google IO 2011中展示 - High-performance GWT

大约7分钟时,讲话地址为'RPC Type Explosion': #4 Watch out for RPC type explosion

出于某种原因,我认为GWT编译器会再次优化它,但看起来我错了。