JAVA: тип параметра, скрывающий тип класса

У меня есть это

abstract class Operand {
    public abstract <T extends Operand> Operand operation(Operator operator, T operand);
}
abstract class Numeric extends Operand {
}
class Integer extends Numeric 
    @Override
    public <Integer> Operand operation(Operator operator, Integer operand) {//problem
    }
}

Как я могу решить эту ситуацию? Я не хочу использовать дженерики в классе операндов (поэтому у меня есть операнд), потому что мне нужно, чтобы операнд был одного типа. Внутри метода Integer мне нужно вызвать конструктор (new Integer(arg)), решением может быть вызов этого метода другим способом. Решения?

3 ответа

Решение

Попробуй с перегруженным методом

abstract class Operand {
    public abstract <T extends Operand> Operand operation(Operator operator, T operand);
}

abstract class Numeric<T extends Numeric<T>> extends Operand {
    public abstract Operand operation(Operator operator, T operand);
}

class Integer extends Numeric<Integer> {

    @Override
    public Operand operation(Operator operator, Integer operand) {
        // add your Integer specific code here
        return null; // replace null with actual returned value
    }

    @Override
    public <T extends Operand> Operand operation(Operator operator, T operand) {
        // simply call to overridden Integer specific method
        // no harm to downcast it here
        return operation(operator, (Integer) operand); 
    }

}

Проблема заключается в объявлении вашего метода в Operand, который <T extends Operand>, вы должны сопоставить этот "контракт" с вашей реализацией -

class Integer extends Numeric {
  @Override
  public <T extends Operand> Operand operation(Operator operator, T operand) {
    // Like this....
  }
}

Мне кажется, вы хотите что-то вроде этого:

abstract class Operand<T, U> {
    public abstract T operation(Operator operator, U operand);
}
abstract class Numeric<T, U> extends Operand<T, U> {
}
class Integer extends Numeric<Integer, Integer>
    @Override
    public Integer operation(Operator operator, Integer operand) {
    }
}
Другие вопросы по тегам