为什么POP和PUSH方法的返回类型和参数类型分别是子类型而不是父类型?
假设我定义了一些类,如下所示:
public class Parent {
}
public class Child extends Parent {
}
public class ParentStack<E extends Parent> {
private Object[] elements;
private int size = 0;
public ParentStack() {
elements = new Object[3];
}
public void push(E e) {
elements[size++] = e;
}
public E pop() {
E result = (E) elements[size--];
elements[size] = null;
return result;
}
}
public class ChildStack extends ParentStack<Child> {
@Override
public Child pop() {
return super.pop();
}
@Override
public void push(Child child) {
super.push(child);
}
}
在泛型擦除之后,返回和参数类型是ParentStack的父级
public class ParentStack {
public void push(Parent e) {
elements[size++] = e;
}
public E pop() {
Parent result = (Parent) elements[size--];
elements[size] = null;
return result;
}
}
因此,从理论上讲,ChildStack应该将类型定义为Parent而不是Child,否则,这些方法根本不会覆盖父方法.如何合理地解释这一点呢?
public class ChildStack extends ParentStack<Child> {
@Override
public Parent pop() {
return super.pop();
}
@Override
public void push(Parent child) {
super.push(child);
}
}