Java泛型方法的继承和覆盖规则

2024-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(意味着每种类型都可以作为类型参数)。你真的想要这个吗?

是里面使用的类型参数Args?我想问题就在那里。


的含义

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

那是caller方法的类型可以决定他想要使用哪种类型参数来调用该方法,只要这是该方法的某个子类型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
  }
}

Now the getAndParse方法实现父类的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java泛型方法的继承和覆盖规则 的相关文章

随机推荐