aig*_*guy 2 java inheritance constructor
我的问题主要涉及这个列表<Dog> List <Animal>的子类?为什么Java的泛型不是隐式多态的?
所以,我们说动物是猫与狗的超级界面.我们还有一个抽象类垃圾
public abstract class Litter{
public Litter(Collection<Animal> animals){}
}
Run Code Online (Sandbox Code Playgroud)
然后我们自然会有一个具体的类KittyLitter
public class KittyLitter extends Litter{
public KittyLitter(Collection<Cat> animals) {
super(animals);
}
}
Run Code Online (Sandbox Code Playgroud)
......还有小狗垃圾.
当然,我们希望将KittyLitter中的所有Animal限制为Cat.为什么Java不允许我们这样做?然后,还可以说我们添加另一种方法 -
public abstract void addCub(Animal animal);
Run Code Online (Sandbox Code Playgroud)
KittyLitter中的具体实现
@Override
public void addCub(Animal cat) {
// TODO Auto-generated method stub
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,这打破了逻辑,并允许我们将Dog插入到没有意义的KittyLitter中.关于为什么Java会对我们做这些事情的任何想法?另外,如果可以将KittyLitter构造函数更改为接受List,为什么type参数的行为会有所不同?任何人都可以解释为什么会这样吗?
编辑:这不是关于构造函数,而是任何覆盖的方法.
您需要使用有界类型参数使超类具有通用性,以说明垃圾可以容纳哪种动物:
public abstract class Litter<T extends Animal> { // <-- type bound
public Litter(Collection<T> animals) { /* ... */ }
public void addCub(T cub) { /* ... */ }
}
public class KittyLitter extends Litter<Cat> {
public KittyLitter(Collection<Cat> cats) {
super(cats);
}
}
Run Code Online (Sandbox Code Playgroud)
这允许子类通过为T指定类型来限制继承的超类方法将接受哪种动物 KittyLitter
.addCub
方法采用Cat
参数,而不是Animal
.和PuppyLitter
的addCub
将采取Dog
.
归档时间: |
|
查看次数: |
78 次 |
最近记录: |