【问题标题】:Is it possible to override a superclass' method with a parameter extending the superclass' method parameter?是否可以使用扩展超类的方法参数的参数来覆盖超类的方法?
【发布时间】:2016-03-21 17:40:51
【问题描述】:

假设我有这样的课程:

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 方法中抛出异常。

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

【问题讨论】:

  • 你试过编译看看是否允许吗?
  • 我试过了,并没有覆盖super的方法,我改一下问题
  • 什么是SuperSomething
  • 搞错了,马上改!
  • 覆盖很好。方法实现还有其他问题。它在BC 类中在哪里抛出异常?还有checkClass方法的实现在哪里?

标签: java inheritance polymorphism abstract


【解决方案1】:

您可以通过指定类型可以是 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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2015-10-27
    • 1970-01-01
    • 2019-05-03
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多