前些写用LinkedHashSet带来的思考(http://rmn190.iteye.com/blog/332819)看 LinkedHashSet源码时,又想起这样的问题: 当父类实现了某一接口,子类还需不需显式地写出也实现这一接口。 例HashSet实现了Set接口, 那么子类LinkedHashSet还需不需要再写实现现了Set接口呢?跟大家一样,我的答案是:不再需要。 可看LinkedHashSet源码发现,它写出来了,如下所示:
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
这是为什么呢? 是自己猜错了? 还是Sun错了?还是都对,那为什么还要让LinkedHashSet实现Set接口呢?
先用实验排除自己没错,为此,专门写了一个小例子,如附件所示。实验证明自己的猜想没错。
应该也不是Sun写错了, 现在类似这样的事多了,一直也没见JVM报错。
看来是都对了,那Java库的这样写法是出于什么目地? 用javadoc命令生成文档时方便?不至于吧, 用这个命令生成文档时所摘取的描述文字是手写的, 而不是从类的实现/继承关键字来抽取信息的.
还有什么原因呢?
想想......
上面提到用javadoc命令时说法不错, 不过生成的文档里不仅仅有对类的描述信息, 它还有如图所示的继承实现信息:
javadoc命令为了收集继承信息肯定得要迭代遍历了,不过为了收集接口实现信息若遍历的话,运算量相当地大,于是Sun就偷懒了: 实现javadoc时没有写那么的遍历,为了得到实现接口信息就只能由程序员在写代码时加上那些必要的接口。
于是写到这里,我“大胆”地得出如下猜想:
1. 只要父类实现了某个接口, 子类就不再显式地写,JVM不会报错,这个实验已验证。
2, Java标准库里这样写是由于生成JavaDoc文档的考虑, 这个还有没有得到验证。