Java泛型和Number类

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类有方法为每个灵长类动物检索这个,但我想要一个干净的方法来选择正确的.

这可能吗?

干杯

Aar*_*lla 9

NumberAPI不提供一个干净的方式来获得的价值; 你必须使用instanceof.

一种解决方案是将值"折叠"为两种类型:longdouble.这样,您可以使用此代码:

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)

这应该始终有效,并为您提供最准确的结果.


Sea*_*oyd 5

不幸的是,如果不求助于 if/else 块,就无法从包装器类型中获取原始类型。

问题是不可能以通用方式实现这样的方法。以下是人们可以期望在 Number 类中找到的一些看似可能的方法:

public abstract X getPrimitiveValue();
Run Code Online (Sandbox Code Playgroud)

这会很好,不是吗?但是这是不可能的。有没有可能的X可能是一个抽象了intfloatdouble等。

public abstract Class<?> getCorrespondingPrimitiveClass();
Run Code Online (Sandbox Code Playgroud)

这也无济于事,因为无法实例化原始类。

所以你唯一能做的事情是使用longValue()ordoubleValue()方法,但如果你处理错误的类型,你会丢失信息。

所以不:java 数字层次结构不适合以通用方式解决此类问题。