ber*_*uic 17 java abstract-class default-value abstract
我试图定义一个抽象的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's 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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个构造函数,只需要start和stop,并设置一个默认的步长值1,无论是什么实现Number T(例如,如果T是Integer [one]有值1,如果T是Long [one]有值1L,依此类推).我想要像:
protected Range(T start, T stop) {
this(start, stop, [one]);
}
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何设定价值[one].由于Java对我来说还是一个新手,我尝试过:
private static final T one = 1;
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为T显然是在实例化中定义的Range.this.我也尝试过:
protected static abstract T getOne();
Run Code Online (Sandbox Code Playgroud)
这也不起作用,因为T在Range.thisplus 的实例化中定义static并且abstract不能一起工作.
我需要一些方法来扩展类以强制定义值,[one]无论实现什么实现Number Range.
最后我还想将零值设置为默认开始,这样我得到一个如下所示的构造函数:
protected Range(T stop) {
this([zero], stop, [one]);
}
Run Code Online (Sandbox Code Playgroud)
sp0*_*00m 16
一种解决方案是询问子类使用的默认步骤:
public abstract class Range<T extends Number> {
private T start;
private T stop;
private T step;
public Range(T start, T stop, T step) {
this.start = start;
this.stop = stop;
this.step = step;
}
protected Range(T start, T stop) {
this.start = start;
this.stop = stop;
this.step = getDefaultStep();
}
protected abstract T getDefaultStep();
}
public class IntegerRange extends Range<Integer> {
public IntegerRange(Integer start, Integer stop, Integer step) {
super(start, stop, step);
}
public IntegerRange(Integer start, Integer stop) {
super(start, stop);
}
@Override
protected Integer getDefaultStep() {
return 1;
}
}
public class DoubleRange extends Range<Double> {
public DoubleRange(Double start, Double stop, Double step) {
super(start, stop, step);
}
public DoubleRange(Double start, Double stop) {
super(start, stop);
}
@Override
protected Double getDefaultStep() {
return 1d;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用此实现:
protected Range(T start, T stop) {
this(start, stop, (T) (new Integer(1)));
}
Run Code Online (Sandbox Code Playgroud)