【问题标题】:Java Generics for using <T> methods not defined in parent class用于使用未在父类中定义的 <T> 方法的 Java 泛型
【发布时间】:2021-01-24 23:37:39
【问题描述】:

我有一个方法如下

private <T extends GenericObject>void printStatus(final T result) {
    System.out.println("Status", result.getStatus());
    System.out.println("GenericStatus", result.getGenericStatus());
    System.out.println("GenericMessage", result.getGenericMessage());

}

getGenericStatus 和 getGenericMessage 方法在 genericObject 父类中定义。但是,getStatus 方法是在扩展 GenericObject 的子类中定义的,getStatus 的返回类型是一个枚举,每个子类都有不同的定义。比如

public class A extends GenericObject {

      /** Enum Astatus. */
      private AStatus status;

      AStatus getStatus() {
           return status;
      }
 }

public class B extends GenericObject {

      /** Enum Bstatus. */
      private BStatus status;

      BStatus getStatus() {
           return status;
      }
 }

问题是 printStatus 中的 result.getstatus() 给出编译错误。在不重构大量代码的情况下,在 printStatus 方法中解决此问题的最简单方法是什么?

【问题讨论】:

  • 使 GenericObject 成为一个抽象类。它显然符合您的要求。
  • 请格式化您的帖子。坦率地说,我发现很难解析您的语法和类方法的名称。很难读。
  • GenericObject这个名字难道不是对声明零类型参数的类的误称吗?

标签: java generics inheritance extends


【解决方案1】:

T 只出现在一个地方时,在T 中使方法泛型是没有意义的。相反,你可以写:

private void printStatus(GenericObject result) { ... }

类型变量主要是在多处出现时才加值,如:

<T> T choose(boolean condition, T ifTrue, T ifFalse) { 
    return condition ? ifTrue : ifFalse;
}

<T> List<T> toList(Set<T> set) { ... }

因为它们表达了多个参数之间或参数和返回之间的实际约束。

【讨论】:

    【解决方案2】:

    一种方法是将getStatus 的声明推到GenericObject 类:

    public class GenericObject {
        public abstract Object getStatus();
    
        // Other methods...
    }
    

    其他类不必更改,因为允许子类专门化父方法的返回类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多