【问题标题】:Java inheritance and genericsJava继承和泛型
【发布时间】:2011-04-07 00:57:44
【问题描述】:

我正在尝试使用泛型扩展一个抽象类,但遇到了问题:

abstract public class SomeClassA<S extends Stuff> {
  protected ArrayList<S> array;

  public SomeClassA(S s) {
    // ...
  }

  public void someMethod() {
    // Some method using the ArrayList
  }

  abstract public void anotherMethod() {
    // ... 
  }
}

现在我想用另一个抽象类来扩展这个类,这样我就可以覆盖“someMethod”。我试过了:

abstract public class SomeClassB<Z extends Stuff> extends SomeClassA {

  public SomeClassB(Z z) {
    super(z);
  }

  @Override public void someMethod() {
    // Some method using the ArrayList
  }

}

NetBeans 没有发现构造函数有任何问题,但我无法在方法 someMethod 中使用 SomeClassA 中的 ArrayList。所以我尝试了:

abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<S extends Stuff> {

  public SomeClassB(Z z) {
    super(z);
  }

  @Override public void someMethod() {
    // Some method using the ArrayList
  }

}

现在这很奇怪。一切似乎都有效(我现在可以使用数组列表,但 NetBeans 说 SomeClassB 的声明中有一个“>”,但它不会编译。如果可能,我想:

  1. 了解如何解决这个特殊问题。

  2. 有一个很好的参考来理解泛型。

  3. 想知道在 C# 中是否更容易。

【问题讨论】:

    标签: java generics inheritance abstract


    【解决方案1】:

    您还需要将泛型类型传递给超类,如下所示:

    abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<Z>
    

    您的超类和子类都将使用相同的泛型类型。泛型类型不会被子类继承或传递给超类。

    【讨论】:

    • 啊,现在我有了答案,这很有意义。非常感谢!
    【解决方案2】:

    如需了解泛型的良好参考,请查看Effective Java, 2nd Edition

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多