1 回答

TA貢獻1810條經驗 獲得超5個贊
這非常簡單 - 的方法簽名期望為實際方法調用“即時”設置Immutable#builder類型參數,而不是綁定到類。T要適當地覆蓋此方法,簽名ConcreteClass將是
public <T> Builder<T> builder() {
這顯然與您的構建器定義沖突
return new AbstractClass.AbstractBuilder<ConcreteClass>(this);
為了使這一切都可編譯,你必須從類而不是方法調用者中推斷出T,Immutable#builder即你終于有了
public interface Immutable<T> {
public interface Builder<T> {
public T build();
}
public Builder<T> builder();
}
并且所有繼承類都相應地更改以將 a 傳遞T給它的前輩。
public interface Interface<T> extends Immutable<T> {
public interface BuilderInterface<T> extends Immutable.Builder<T> {
}
}
public abstract class AbstractClass<T> implements Interface<T> {
public static class AbstractBuilder<T> implements Interface.BuilderInterface<T> {
private final T object;
public AbstractBuilder(T object) {
this.object = object;
}
@Override
public T build() {
return this.object;
}
}
protected AbstractClass() {
super();
}
}
public class ConcreteClass extends AbstractClass<ConcreteClass> {
public ConcreteClass() {
}
@Override
public Builder<ConcreteClass> builder() {
return new AbstractClass.AbstractBuilder<ConcreteClass>(this);
}
}
添加回答
舉報