我试图定义一个抽象的Range类,它将作为许多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;
}
}
现在,我想添加一个仅包含start
和的构造函数stop
,并设置默认的步长值1
,无论Number
T
is的实现是什么(例如ifT
是否Integer
[one]
具有该值1
,if T
isLong
[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
加static
和abstract
不一起工作。
我需要某种方法来扩展类,[one]
无论执行何种实现,Number
Range
都必须强制定义其值。
最终,我还想将零值设置为默认开始,这样我就得到了一个如下所示的构造函数:
protected Range(T stop) {
this([zero], stop, [one]);
}
一种解决方案是向子类询问要使用的默认步骤:
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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句