Pattern Builder Java: как ссылаться на тип generi c в BaseBuilder для Generi c BaseClass - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу реализовать шаблон Builder для Generi c Базовый класс и подкласс застрял при определении типа Generi c в Base Builder. Вот классы.

Подкласс:

public class Sub extends Base<T> {
 private final String key;
      private Sub(Builder builder) {
       super(builder);
       this.key = builder.key;
     }
public static SubBuilder extends Base.BaseBuilder<SubBuilder> {
     String key;
    public SubBuilder key(String key) {
      this.key = key;
      return this;
    }
  @Override
  public Sub build() {
  return new Sub(this);
  }
}
}

Базовый класс:


public class Base<T> {
 private final T type;
 protected Base(BaseBuilder<?> build) {
  this.type = build.type; 
}
//Base Builder
public static class BaseBuilder<B extends BaseBuilder<B>> {
 T type;  //This is obviously not right because T is not static reference 
 public B type(T type) {
 this.type = type;
  return (B)this;
}
public Base build() {
return new Base(this);
}
} 
}

Как уже упоминалось, не может ссылаться на тип T в BaseBuilder. Как установить T с помощью компоновщика здесь. Также нельзя удалить stati c из BaseBuilder. Подходит ли шаблон строителя для такого рода проблем?

1 Ответ

0 голосов
/ 05 апреля 2020

Добавить T параметр типа к BaseBuilder, Sub и SubBuilder:

public class Base<T> {
    private final T type;

    protected Base(BaseBuilder<?, T> build) {
        this.type = build.type;
    }

    public static class BaseBuilder<B extends BaseBuilder<B, T>, T> {
        private T type;

        public B type(T type) {
            this.type = type;
            return (B) this;
        }

        public Base<T> build() {
            return new Base<>(this);
        }
    }
}
public class Sub<T> extends Base<T> {
    private final String key;

    private Sub(SubBuilder<T> builder) {
        super(builder);
        this.key = builder.key;
    }

    public static class SubBuilder<T> extends BaseBuilder<SubBuilder<T>, T> {
        private String key;

        public SubBuilder<T> key(String key) {
            this.key = key;
            return this;
        }

        @Override
        public Sub<T> build() {
            return new Sub<>(this);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...