在this video from Google IO 2009中,演示者很快就会说方法的签名应该返回具体类型而不是接口。
根据我在视频中看到的内容,这与GWT Java-to-Javascript编译器有关。
答案 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':
出于某种原因,我认为GWT编译器会再次优化它,但看起来我错了。