Я пытаюсь определить абстрактный класс Range, который будет служить базовой реализацией ряда классов диапазонов. Предполагаемое использование не имеет значения для этого вопроса, но до сих пор я:
/**
* Abstract generic utility class for handling ranges
*/
public abstract class Range<T extends Number> {
// Variables to hold the range configuration
private T start;
private T stop;
private T step;
/**
* Constructs a range by defining it limits and step size.
*
* @param start The beginning of the range.
* @param stop The end of the range.
* @param step The stepping
*/
public Range(T start, T stop, T step) {
this.start = start;
this.stop = stop;
this.step = step;
}
}
Теперь я хочу добавить конструктор с тем, который принимает только start
и stop
, и устанавливает значение шага по умолчанию 1
, независимо от того, какая реализация Number
T
(например, если T
Integer
[one]
будет иметь значение 1
, а если T
есть Long
[one]
, будет иметь значение 1L
и т.д.). Мне хотелось бы что-то вроде:
protected Range(T start, T stop) {
this(start, stop, [one]);
}
но я не могу понять, как это установить значение [one]
. Поскольку Java по-прежнему для меня совершенно новичок, я пробовал:
private static final T one = 1;
который не работает, потому что T
, очевидно, определен в инстанцировании Range.this
. Также я пробовал:
protected static abstract T getOne();
который также не работает, потому что T
определяется в экземпляре Range.this
plus static
и abstract
не работает вместе.
Мне нужно каким-то образом расширить классы, чтобы они были вынуждены определять значение [one]
независимо от того, какая реализация Number
Range
реализована для.
В конечном итоге я также хотел бы установить нулевое значение как начало по умолчанию, так что я получаю конструктор, который выглядит так:
protected Range(T stop) {
this([zero], stop, [one]);
}