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) {
}
}