我有一个方法,如下
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...
}
其他类不必更改,因为允许子类专门化父方法的返回类型。