Java - 根据输入参数返回不同的子类

时间:2015-03-20 21:01:04

标签: java generics inheritance

鉴于这些课程:

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

我觉得这应该比我做的更容易。我如何保持这个整体模式,但允许这个编译?

感谢所有帮助过的人!

1 个答案:

答案 0 :(得分:0)

你想要的是模式Factory Method。注意:这里的通用性确实没有任何好处。你只是创造了一些东西,然后推测它会继续发展。当您想要利用与域对象正交的代码时,泛型往往会产生最大的好处,例如集合。