是否可以使用扩展超类'方法参数的参数覆盖超类'方法?

时间:2015-12-15 19:18:04

标签: java inheritance polymorphism abstract

说我有一个这样的课程:

abstract class Something {}

它有一个延伸它的类的层次结构:

class FirstSomething extends Something {}
class SecondSomething extends Something {}

然后在其他地方,我有一个班级利用这些事情:

abstract class A {
    public void setSomething(Something something) {
        //Process the something
    }
}

我是否可以指定A的子类,以便它覆盖setSomething方法,使用更具体的“某事”类? 这是我希望能够做到的:

class B extends A {
    @Override
    public void setSomething(FirstSomething something) {
        //Process the something
    }

class C extends A {
    @Override
    public void setSomething(SecondSomething something) {
        //Set the something
    }

目前我正在A班做这样的事情:

public void setSomething(Something something) {
    checkClass(something);
    //Use the something
}
protected abstract void checkClass(Something something);

如果SuperSomething的类型不适合这些类,则B类和C类在checkClass方法中抛出异常。

编辑: 我已尝试使用上面的确切方法签名,但子类方法不会覆盖super的方法,我想我真的在问: 有没有办法在超类的定义中指定一个方法,对于超类的子类,在setSomething方法中是否允许对象类型进行编译时检查?

1 个答案:

答案 0 :(得分:5)

您可以通过指定类型可以是Something或其子类之一来使A类成为通用的(我已经使setSomething方法成为抽象但是如果您可以提供实现要)。

abstract class A <T extends Something> {
    public abstract void setSomething(T something);
}

然后强制类型T成为子类中所需的特定类。

class B extends A<FirstSomething> {
    @Override
    public void setSomething(FirstSomething something) {
        //Set the something
    }
}

class C extends A<SecondSomething> {
    @Override
    public void setSomething(SecondSomething something) {
        //Set the something
    }
}