Общая переменная экземпляра в абстрактном классе - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу создать родительский / абстрактный класс, который заставляет дочерние классы объявлять переменные.

например. У меня есть 2 абстрактных класса

public abstract class Key {  <something> }
public abstract class Value { <something> }

Теперь создаем ребенка для свыше.

public class ChildKey extends Key { <something> }
public class ChildValue extends Value { <something> }

Я хочу создать класс Result, который может выглядеть как

public abstract class Result {
 protected <T extends Key> key;
 protected <T extends Value> value;
}

чтобы я мог создать потомок Результата как

public class ChildResult extends Result {
 public ChildKey key; // this should be forcible
 public ChildValue value; // Same as above
 <some method>
}

Я пробовал несколько вещей, но это не сработало.

Есть мысли, как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Вы не можете использовать подобные обобщения для объявления переменных.

public abstract class Result {
    protected Key key;
    protected Value value;


    public Result(){
        key = giveKey();
        value = giveValue();
    }

    public abstract Key giveKey();
    public abstract Value giveValue();
}

Вам придется переопределить их в ChildResult возвращенные значения будут назначены вашим полям.

0 голосов
/ 05 сентября 2018

Вы можете принудительно задать свои свойства в классе Result:

public abstract class Value {}
public abstract class Key {}
public class ChildValue extends Value {}
public class ChildKey extends Key {}
// use type parameters and force attributes in your abstract class of result
public abstract class Result<K extends Key, V extends Value> {
  protected K key;
  protected V value;

  public List<String> fetchResult() {
      return new ArrayList<>();
  }
}

и используйте его как:

public class Main {
  public static void main(String[] args) {
      Result result = new Result<ChildKey,ChildValue>(){};
      result.fetchResult();
  }
}
0 голосов
/ 05 сентября 2018

Вы можете сделать это так:

public abstract class Key {
}

public abstract class Value {
}

public class ChildKey extends Key {

}
public class ChildValue extends Value {

}

public abstract class Result<K extends Key, V extends Value> {
    protected final K key;
    protected final V value;

    protected Result(K key, V value) {
        this.key = key;
        this.value = value;
    }
}

public class ChildResult extends Result<ChildKey, ChildValue> {

    public ChildResult(ChildKey key, ChildValue value) {
        super(key, value);
    }
}
...