我有2个不同的课程。一个是通用valueHolder,它可以包含扩展数字的任何内容。
class ValueHolder<T extends number>{
private T currentValue;
//more functions, database logic, etc...
}
另一个类更复杂,并且具有“targetValue”。它的参数化如下:
class MoreComplexClass<T extends ValueHolder<?>>
private T valueHolder;
private XXX requiredValue;
//a lot more functions.
}
是否可以将valueHolder的Type用于MoreComplexClass的requiredValue? 我想要实现的是:Beeing能够将currentValue和requiredValue与&gt;进行比较。 ==&lt;操作人员无需铸造而不会丢失类型安全。 (也许我也在想复杂的方法来实现这个目标)
答案 0 :(得分:3)
答案是肯定的,你可以用这种方式声明复杂类:
class MoreComplexClass<N extends Number, T extends ValueHolder<N>>
private T valueHolder;
private N requiredValue;
//a lot more functions.
}
但由于您使用的是Number
类,因此无法使用这些运算符,您需要使用其中一种XXXvalue()
方法(即:doubleValue()
,longValue()
来自Number
类,以便能够使用这些运算符。
答案 1 :(得分:0)
由于评论我做了一些更改,现在看起来像这样:
public class ValueHolder<T extends Comparable<T>> {
private T currentValue;
public T getCurrentValue() {
return currentValue;
}
public void setCurrentValue(T currentValue) {
this.currentValue = currentValue;
}
}
public class MoreComplexClass<N extends Comparable<N>, T extends ValueHolder<N>> {
private T valueHolder;
private N requiredValue;
public N getRequiredValue() {
return requiredValue;
}
public void setRequiredValue(N requiredValue) {
this.requiredValue = requiredValue;
}
public T getValueHolder() {
return valueHolder;
}
public void setValueHolder(T valueHolder) {
this.valueHolder = valueHolder;
}
}
现在我也可以用Generic方式进行比较(这是essentiell,因为我不想投射到所有可能的类型。在Sidenote中,这也适用于Dates等。):
public class Main {
public static void main(String[] args) {
ValueHolder<Long> longHolder = new ValueHolder<>();
longHolder.setCurrentValue(2L);
MoreComplexClass<Long, ValueHolder<Long>> mcc = new MoreComplexClass<>();
mcc.setRequiredValue(1L);
int compare = mcc.getRequiredValue().compareTo(mcc.getValueHolder().getCurrentValue());
if (compare < 0) {
} else if (compare > 0) {
}else{
}
}
}
我会给你一个解决方案,让我指向正确的方向;)