当前位置: 首页 > 面试题库 >

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

唐骏祥
2023-03-14
问题内容

说我有一个像这样的课程:

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方法中允许的对象类型?


问题答案:

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


 类似资料:
  • 问题内容: 我有一个大型的检票口组件库,这些检票口组件使用自定义注释或另一个注释进行注释,该注释具有一个参数以允许多个注释。 这是一个示例代码片段: 到目前为止,我使用apt来检查引用的资源是否确实存在。例如 除非在类路径中找到该文件,否则将导致编译失败。这部分效果很好。 现在,我还是DRY的粉丝,我想使用相同的注释在创建对象时将其实际注入到对象中。使用AspectJ,我已经实现了其中的一部分。

  • 我有一个名为的超级类,我有3个子类,分别是,和。 在每个子类中,我都有私有参数,和。 我想在 类中创建一个名为 的方法,该方法从 中删除 1 并将 10 添加到中,以便我可以在 main 方法中调用它们时将该方法应用于所有子类。但是如何将私有参数从子类获取到超类中呢? 我不能在超类中声明它们,因为每个子类都有自己的默认启动参数,这些参数应该在游戏期间进行。

  • 我有一个抽象超类和两个非抽象子类和。如何在超类方法中定义类型,如下所示 我允许在子类方法中编写具体类型(例如,或) 在上面的示例中,子类方法不会覆盖超类方法。

  • 问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c

  • 问题内容: 我有以下类和接口: 我想创建一个方法,其中参数需要为BasicObject类型并实现CodeObject。我尝试了以下代码,但不能保证clazz是实现CodeObject的类。 我想做这样的事情,但不能编译: 问题答案: 您的模式类必须扩展和扩展/实现(实际上是一个接口)。您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示: 请注意,如果您通过以下任何一种方式进行操作,

  • 我有以下类和接口: 我想创建一个方法,其中参数需要是BasicObject类型,并实现CodeObject。我尝试了以下代码,但它不能保证clazz是一个实现CodeObject的类。 我想做这样的事情,但它无法编译: