用于使用父类中未定义的 <T> 方法的 Java 泛型

Saa*_*aad 0 java generics inheritance extends

我有一个方法如下

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());

}
Run Code Online (Sandbox Code Playgroud)

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;
      }
 }
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*etz 6

TT仅出现在一处时,将方法设为泛型是没有意义的。相反,你可以只写:

private void printStatus(GenericObject result) { ... }
Run Code Online (Sandbox Code Playgroud)

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

<T> T choose(boolean condition, T ifTrue, T ifFalse) { 
    return condition ? ifTrue : ifFalse;
}
Run Code Online (Sandbox Code Playgroud)

或者

<T> List<T> toList(Set<T> set) { ... }
Run Code Online (Sandbox Code Playgroud)

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