Seibel:如果去掉泛型,现在Java会变得更好用吗?
Bloch:我不知道。我还是喜欢泛型。泛型能帮我找到代码中的Bug。泛型可以让编译器强制做一些限制,之前这些限制我只能放在注释中。另一方面来说,当我看到那些疯狂的参数类型相关的错误信息,当我看到像 classEnum<EextendsEnum<E>>这样的泛型类型声明时,我就会想,显然泛型的设计还没成熟到可以放到 Java中的水平。
我们总是太乐观,然后搬起石头砸自己的脚。所以我们说:“耶!我们当然可以把泛型放到Java中。在CLU的时候我们就知道泛型了。这技术25年前就有了。”最近我听到关于闭包的类似言论,不过那是50年前的技术了。“噢,闭包很简单,不会给语言加入任何新的复杂性。”
嗯,没错。但是我觉得我们从泛型这件事儿得到了教训。在你懂得这个改动会对概念层面带来什么影响之前,在你可以确保软件行业从业人员可以高效地使用新特性,而且这一新特性会让他们活得更好之前,你不应该给语言加入这一特性。
如果早知道程序员们对泛型是这个反应,我们肯定不会把它加到Java里。这是不是说我们就完全不会搞泛型?不,我不这么认为。我认为泛型确实很好。主要是因为大多数集合是同质的,而不是异质的,同质的集合处理起来是比较方便的。多数情况下类型转换都不合适。转换可能会失败,而且让你的程序不再优雅。我想你知道这是什么集合,它应该自动符合你的这些需求。但是,是不是这就意味着你应该承受我们现在承受的这种复杂度?不,我想我们只是没有处理好泛型。
Seibel:关于泛型有来自于用户的压力吗?有人抱怨泛型的缺点干扰他们写程序了吗?
Bloch:有没有工程师大骂泛型的缺点?不,没有,他们没有抱怨过。如果因为泛型简洁就把它们加进来,那我会内疚的。因为当时我们以为这么做是对的。
有人说,很多工程都是扯淡。有人要求我们加入foreach吗?没有。他们没有要求我加入。但是我就知道这是应该做的。我对了——每个人都喜欢它。但是我觉得我们行业内的一大问题就是,在工程领域,做一个东西,仅仅因为它简洁,仅仅因为它是一个好的工程项目,等等。如果你不能解决真实用户——在这里就是Java程序员——的真实问题,那么你就不应该加入新的特性。
James Gosling曾做过一个非常了不起的演讲——“Java的感觉”。他说,给Java加入任何东西之前,都需要三个真实的用户。不应该因为一个东西简洁就把它放进来。
但是人们就是想把什么东西都放进去。工程师是做什么的?他们就是写代码的。而当他们写一个库,或者一个语言的时候,他们就是想放各种东西进去。你需要他人的参与,需要指导的声音,需要这些东西来帮助你完成产品,帮你在放与不放之间做出最好的权衡。因为你可以放进去的东西总比你应该放进去的东西多。那么是不是说所有的这些东西都不好呢?那也不是。只是你需要做出决定,某些东西是不应该放进去的。
|