java - 泛型、 super 和扩展的问题

标签 java generics inheritance

我有一个(通用)类,它保存其他类的元数据。元数据有多种使用方式(写入和读取 XML 数据、数据库、输出为文本等)。到目前为止这有效。但是当我将所有这些用于从其他类继承的类时,我遇到了一个问题。

请看一下下面的代码(我尝试生成一个可编译的最小示例,除了下面标记的行之外):

class A {
  public Meta<? extends A> getMeta() {
    return new Meta<A>();
  }

  public void output() {
    /*
     * Error shown in eclipse for the next line:
     * The method output(capture#1-of ? extends A) in the type
     * Outputter<capture#1-of ? extends A> is not applicable for the arguments
     * (A)
     */
    getMeta().getOutputter().output(this);
  }
}

class B extends A {
  @Override
  public Meta<? extends B> getMeta() {
    return new Meta<B>();
  }
}

class Meta<CLS> {
  public Outputter<CLS> getOutputter() {
    return null;
  }
}

class Outputter<CLS> {
  public void output(CLS obj) {
  }
}

我可以更改A.getMeta()返回Meta<A>使上面的行可编译,但随后我无法将其覆盖为 Meta<B> getMeta() B 类。

关于如何解决这个问题有什么想法吗?

最佳答案

如果你这样做怎么办?它还需要一个类,但看起来它会起作用:

class T{
 //put common methods here, generic methods are not common, so they will not be here
}

 class A extends T{
  public Meta<A> getMeta() {
    return new Meta<A>();
  }

  public void output() {
    /*
     * Error shown in eclipse for the next line:
     * The method output(capture#1-of ? extends A) in the type
     * Outputter<capture#1-of ? extends A> is not applicable for the arguments
     * (A)
     */
    getMeta().getOutputter().output(this);
  }
}

class B extends T {

  public Meta<B> getMeta() {
    return new Meta<B>();
  }
}

class Meta<CLS> {
  public Outputter<CLS> getOutputter() {
    return null;
  }
}

class Outputter<CLS> {
  public void output(CLS obj) {
  }
}

如果您不想创建其他方法,您可以使用复合方法。关于组合优于继承,有很多很好的讨论。

除了 AB 类之外,一切都一样:

  class A{
      public Meta<A> getMeta() {
        return new Meta<A>();
      }
      ...
     } 

    class B {

      private class A a; 

      public Meta<B> getMeta() {
        return new Meta<B>();
      }
      //use a here if you need, a is composed into B
    }

关于java - 泛型、 super 和扩展的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17852504/

相关文章:

java - 在简单示例项目中更改 Spring 框架日志级别?

java - Selenium : How to solve org. openqa.selenium.InvalidElementStateException: 无效元素状态

class - Haskell构造一个类型包含类

java - 为什么我不能分配给这个通用变量?

Javascript,原型(prototype)不继承

c++ - 使用继承的具体类在 C++ 中实现接口(interface)

java - 聚合对象和边界

java - 在 IntelliJ 中查找整个项目中的所有匿名类

java - 如何在解释的情况下使用java中的泛型类型声明?

sql - 类表继承模型的 INSERT 语句