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



我有一个方法,如下

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

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

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

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

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

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

最新更新