七、泛型类与子类型
在谈这一小节时,先回顾一下泛型方法的“extends”含义,泛型的“extends”与继承的“extends”并不一样,泛型的“extends”其后可以是一个类(如T extends Number),同样也可以是一个接口(如T extends List<T>)。泛型的”extends“代表子类型,而不是子类,或许你可以把等其同于”extends(继承)“和”implement的并集。
在泛型里,也存在子类型,前提是其泛型参数的限制并没有改变,可以认为泛参没有改变,其实就是从原来的类或接口来判断泛型的子类型。为了形象理解,我们已collection类来作个例子,如:ArrayList<E> implement List<E>,而List<E> extends Collection<E>,那么ArrayList<String>就是List<String>的子类型,而List<String>则是Collection<String>,其关系图如下:
深入一点来谈,现在假设需要定义自己的List接口 — PayLoadList,其定义如下:
interface PayloadList<E,P> extends List<E> {
void setPayload(int index, P val);
//...
}
如上,则下面的样例都是List<String>子类型,:
PayloadList<String,String>
PayloadList<String,Integer>
PayloadList<String,Exception>
如图: