首页 > 解决方案 > 用于使用的 Java 泛型父类中未定义的方法

问题描述

我有一个方法如下

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 方法中解决此问题的最简单方法是什么?

标签: javagenericsinheritanceextends

解决方案


T将方法泛型化为whenT只出现在一个地方是没有意义的。相反,您可以只写:

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) { ... }

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


推荐阅读