假设我需要一些DerivedBuilder来扩展一些BaseBuilder。基本构建器具有类似foo的方法(该方法返回BaseBuilder)。派生的生成器具有bar方法。方法bar应该在方法foo之后调用。为了做到这一点,我可以像这样在foo中覆盖DerivedBuilder方法:

@Override
public DerivedBuilder foo() {
    super.foo();
    return this;
}

问题是BaseBuilder有很多像foo这样的方法,我必须重写它们中的每一个。我不想这样做,所以我尝试使用泛型:
public class BaseBuilder<T extends BaseBuilder> {
    ...

    public T foo() {
        ...
        return (T)this;
    }
}

public class DerivedBuilder<T extends DerivedBuilder> extends BaseBuilder<T> {
    public T bar() {
        ...
        return (T)this;
    }
}

但是问题是我仍然不能写
new DerivedBuilder<DerivedBuilder>()
        .foo()
        .bar()

即使这里的TDerivedBuilder。为了不覆盖很多功能,我该怎么办?

最佳答案

您的问题是DerivedBuilder的定义:

class DerivedBuilder<T extends DerivedBuilder>;

然后使用类型已擦除的参数new DerivedBuilder<DerivedBuilder<...what?...>>()实例化它。

您将需要一个完全定义的派生类型,如下所示:
public class BaseBuilder<T extends BaseBuilder<T>> {
    @SuppressWarnings("unchecked")
    public T foo() {
        return (T)this;
    }
}

public class DerivedBuilder extends BaseBuilder<DerivedBuilder> {
    public DerivedBuilder bar() {
        return this;
    }
}

检查ideone.com

关于Java通用生成器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39015564/

10-10 03:08