Mr *_*r R 10 java generics numbers
我想创建一个比较数字的方法,但可以有一个输入,它是Number的任何子类.
我看过这样做的方式......
public static <T extends Number> void evaluate(T inputNumber) {
if (inputNumber >= x) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在我可以执行比较之前,我需要得到实际的灵长类动物,Number类有方法为每个灵长类动物检索这个,但我想要一个干净的方法来选择正确的.
这可能吗?
干杯
该NumberAPI不提供一个干净的方式来获得的价值; 你必须使用instanceof.
一种解决方案是将值"折叠"为两种类型:long和double.这样,您可以使用此代码:
if( inputNumber instanceof Float || inputNumber instanceof Double ) {
double val = inputNumber.doubleValue();
...
} else {
long val = inputNumber.longValue();
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于标准数字类型,但Number也由许多其他类型(AtomicInteger,BigDecimal)实现.
如果你想支持所有类型,一个技巧是使用BigDecimal:
BigDecimal value = new BigDecimal( inputNumber.toString() );
Run Code Online (Sandbox Code Playgroud)
这应该始终有效,并为您提供最准确的结果.
不幸的是,如果不求助于 if/else 块,就无法从包装器类型中获取原始类型。
问题是不可能以通用方式实现这样的方法。以下是人们可以期望在 Number 类中找到的一些看似可能的方法:
public abstract X getPrimitiveValue();
Run Code Online (Sandbox Code Playgroud)
这会很好,不是吗?但是这是不可能的。有没有可能的X可能是一个抽象了int,float,double等。
public abstract Class<?> getCorrespondingPrimitiveClass();
Run Code Online (Sandbox Code Playgroud)
这也无济于事,因为无法实例化原始类。
所以你唯一能做的事情是使用longValue()ordoubleValue()方法,但如果你处理错误的类型,你会丢失信息。
所以不:java 数字层次结构不适合以通用方式解决此类问题。
| 归档时间: |
|
| 查看次数: |
13164 次 |
| 最近记录: |