从父

时间:2017-05-09 08:02:39

标签: java generics inheritance

我不知道这是否可能,但我在想Java:

如果我有一个抽象的父类,我可以这样做:

public ParentClass add(ParentClass a, ParentClass b);

如果ParentClass有一个孩子并且我想覆盖此方法,则子类仍将采用ParentClass add(ParentClass, ParentClass)方法。

有没有办法让父函数派生给每个孩子?
我不知道我的措辞是否合适,但是这样的话:

// ParentClass.java
public ParentClass add(ParentClass a, ParentClass b);

// Foo.java
@Override // or an equivalent
public Foo add(Foo a, Foo b) {}

// Bar.java
@Override
public Bar add(Bar a, Bar b) {}

请注意每个孩子如何拥有ParentClass add(...)功能,而是为每个自己的类型设置一个?

显然我可以自己制作这些,但我希望能够在父母身上创造出可以覆盖的东西。我以前从未在实践中见过这个,所以我怀疑它的存在。我只想与拥有比我更高的Java知识的人澄清。感谢。

从理论上讲,我认为没有任何语言可以做过这样的事情:

public child add(child a, child b);
// where *child* is the type of the child inheriting the method

2 个答案:

答案 0 :(得分:4)

在Java中,不允许方法参数的协方差 这个继承的方法:public ParentClass add(ParentClass a, ParentClass b); 对所有孩子都是合法的,因为它允许指定ParentClass的任何子类作为参数 它更灵活 现在,如果您不想要这种灵活性并且想要在继承方法中强制使用特定类型的参数,则应使用泛型抽象类。

public abstract class ParentClass <T extends ParentClass <?>>{
    public abstract ParentClass<?> add(T a, T b);
}

在儿童班,你可以写:

public class ChildClass extends ParentClass <ChildClass>{
    public ParentClass<?> add(ChildClass a, ChildClass b){
       ....
   }
}

答案 1 :(得分:2)

这样的东西可以与泛型一起使用:

public abstract class ParentClass<T extends ParentClass> {
    public abstract T add(T a, T b);
}

class Foo extends ParentClass<Foo> {
    @Override
    public Foo add(Foo a, Foo b) {
        return null;
    }
}

class Bar extends ParentClass<Bar> {
    @Override
    public Bar add(Bar a, Bar b) {
        return null;
    }
}