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

Java通用方法继承和覆盖规则

甄胡非
2023-03-14
问题内容

我有一个具有通用方法的抽象类,并且我想通过用特定类型代替通用参数来覆盖通用方法。所以在伪代码中,我有以下内容:

public abstract class GetAndParse {
  public SomeClass var;

  public abstract <T extends AnotherClass> void getAndParse(T... args);
}

public class Implementor extends GetAndParse {
  // some field declarations

  // some method declarations

  @Override
  public <SpecificClass> void getAndParse(SpecificClass... args) {
    // method body making use of args
  }
}

但是由于某种原因,我不允许这样做?我是在犯某种语法错误还是不允许这种继承和覆盖?具体来说,@Override由于eclipse
IDE不断提醒我要实现,我遇到了一个错误getAndParse

这就是我希望上面的代码起作用的方式。在我的代码的其他地方,有一个方法可以期望实现对象的实例,GetAndParse这具体意味着它们具有getAndParse我可以使用的方法。当我调用getAndParse该实例时,编译器会检查我是否T以正确的方式使用了的特定实例,因此尤其T应进行扩展AnotherClass,应该进行扩展SpecificClass


问题答案:

我们在这里拥有两种不同的方法,每种方法都有各自的类型参数。

public abstract <T extends AnotherClass> void getAndParse(Args... args);

这是一种类型参数为T且由界定的方法AnotherClass,这意味着的每个子类型AnotherClass都可以用作类型参数。

public <SpecificClass> void getAndParse(Args... args)

这是一种方法,其类型参数名为SpecificClass,以限制Object(这意味着每种类型都可以作为类型参数)。你真的想要这个吗?

是在内部使用type参数Args吗?我认为问题就在那里。

的含义

public abstract <T extends AnotherClass> void getAndParse(T... args);

是方法的 调用者
可以决定他要使用哪种类型的参数来调用方法,只要这是的子类型AnotherClass。这意味着实际上可以使用任何类型的对象调用该方法AnotherClass

由于调用者可以决定类型参数,因此您不能在子类中将参数类型缩小到SpecificClass-这不是方法的实现,而是同名的另一个方法(重载)。

也许您想要这样的东西:

public abstract class GetAndParse<T extends AnotherClass> {
  public SomeClass var;

  public abstract void getAndParse(T... args);
}

public class Implementor extends GetAndParse<SpecificClass> {
  // some field declarations

  // some method declarations

  @Override
  public void getAndParse(SpecificClass... args) {
    // method body making use of args
  }
}

现在,该getAndParse方法实现了父类的方法。



 类似资料:
  • 本文向大家介绍解析Java继承中方法的覆盖和重载,包括了解析Java继承中方法的覆盖和重载的使用技巧和注意事项,需要的朋友参考一下 方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。   如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。   参数列

  • 问题内容: 为什么超类的实例变量在继承中不被覆盖? 问题答案: 因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。 字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在让超类完成其工作。

  • 问题内容: 我正在阅读“深入Python”,并在有关类的章节中给出了以下示例: 然后作者说,如果要覆盖该方法,则必须使用正确的参数显式调用父方法。 如果该班有一个以上的祖先班怎么办? 我是否必须显式调用所有祖先类的方法? 另外,我是否必须对要覆盖的其他任何方法执行此操作? 问题答案: 关于子类-超类调用,这本书有些过时了。在子类化内置类方面也有些过时。 如今看起来像这样: 请注意以下几点: 我们可

  • 在这个程序中,我试图通过使用子类ResziableCircle My code中的重写方法为radious变量赋值 为什么在调用resize函数后,输出中有radious zero的值?我试图找出代码中的问题在哪里,但找不到。

  • 本文向大家介绍php继承中方法重载(覆盖)的应用场合,包括了php继承中方法重载(覆盖)的应用场合的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php继承中方法重载(覆盖)的应用场合。分享给大家供大家参考。具体分析如下: 方法重载(override)/覆盖——在什么情况下使用:当父类知道所有的子类都需要用到一个方法,但父类不知道怎么去写这个方法时,就需要用到方法的重载。这时候,可以让子类

  • 问题内容: 我之所以学习,是因为我参加了考试,而大多数Java并没有很多问题,但是我偶然发现了一个我无法解释的规则。这是一个代码片段: 返回: 1 3 1 3 虽然我希望它会返回: 1 3 1 4 为什么a2的类型确定在AX中调用哪种方法? 我一直在阅读有关重载规则和继承的文章,但这似乎晦涩难懂,以至于我无法找到确切的规则。任何帮助将不胜感激。 问题答案: 这些方法调用的行为由Java语言规范(参