鉴于这些课程:
public class VersionVOV1 extends BaseVO {
private String fieldOne = null;
public String getFieldOne() {
return fieldOne;
}
public void setFieldOne(String fieldOne) {
this.fieldOne = fieldOne;
}
public class VersionVOV2 extends BaseVO {
private String fieldFour = null;
public String getFieldFour() {
return fieldFour;
}
public void setFieldFour(String fieldFour) {
this.fieldFour = fieldFour;
}
}
public class BaseVO {
// common code here
}
我有一个调用方法doSomething
,它根据输入字符串返回一个特定的子类:
public BaseVO doSomething(String version) {
BaseVO versionVO = doSomethingVersioned(createVersionVO(version));
return versionVO;
}
其余方法是:
private BaseVO createVersionVO(String version) {
BaseVO versionVO = null;
if (version.equalsIgnoreCase("V1")) {
versionVO = new VersionVOV1();
} else if (version.equalsIgnoreCase("V2"))
versionVO = new VersionVOV2();
return versionVO;
}
protected VersionVOV1 doSomethingVersioned(VersionVOV1 versionVO) throws Exception {
versionVO.setFieldOne("The versionVO is of type: " + versionVO.getClass());
versionVO.setFieldTwo("Field two");
versionVO.setFieldThree("Field three");
return versionVO;
}
protected VersionVOV2 doSomethingVersioned(VersionVOV2 versionVO) throws Exception {
versionVO.setFieldOne("The versionVO is of type: " + versionVO.getClass());
versionVO.setFieldThree("Field three");
versionVO.setFieldFour("Field four");
return versionVO;
}
正如您所看到的,我已覆盖doSomethingVersioned
以接纳特定的子课程。然而,我的问题在于doSomethingVersioned
上的编译错误:类型VersionExample中的方法doSomethingVersioned(VersionVOV1)不适用于参数(BaseVO)。
我已尝试从<T extends BaseVO>
返回createVersionVO
类型,但后来我在该方法中遇到其他编译错误,指出类型不匹配:无法从VersionVOV1转换为T
我觉得这应该比我做的更容易。我如何保持这个整体模式,但允许这个编译?
感谢所有帮助过的人!
答案 0 :(得分:0)
你想要的是模式Factory Method。注意:这里的通用性确实没有任何好处。你只是创造了一些东西,然后推测它会继续发展。当您想要利用与域对象正交的代码时,泛型往往会产生最大的好处,例如集合。