Java泛型和数字类

Java泛型和数字类,java,generics,numbers,Java,Generics,Numbers,我想创建一个方法来比较一个数字,但可以有一个数字的任何子类的输入 我已经考虑过用以下方式来做这件事 public static <T extends Number> void evaluate(T inputNumber) { if (inputNumber >= x) { ... } } 公共静态无效评估(T输入编号){ 如果(输入编号>=x){ ... } } 在执行比较之前,我需要得到实际的primative,Number类有方法为每个primativ

我想创建一个方法来比较一个数字,但可以有一个数字的任何子类的输入

我已经考虑过用以下方式来做这件事

public static <T extends Number> void evaluate(T inputNumber) {
  if (inputNumber >= x) {
    ...
  }
}
公共静态无效评估(T输入编号){
如果(输入编号>=x){
...
}
}
在执行比较之前,我需要得到实际的primative,Number类有方法为每个primative检索它,但我需要一种干净的方法来选择正确的方法

这可能吗


Cheers

在这种情况下,您可以使用不带泛型的普通方法

API不提供获取值的干净方法;您必须使用
instanceof

一种解决方案是将值“折叠”为两种类型:
long
double
。这样,您可以使用以下代码:

if( inputNumber instanceof Float || inputNumber instanceof Double ) {
    double val = inputNumber.doubleValue();
    ...
} else {
    long val = inputNumber.longValue();
    ...
}
请注意,这仅适用于标准数字类型,但许多其他类型(
AtomicInteger
BigDecimal
)也实现了
number

如果要支持所有类型,一个技巧是使用
BigDecimal

BigDecimal value = new BigDecimal( inputNumber.toString() );

这应该总是有效的,并给你最准确的结果。

使用
的方法总是很麻烦,因为你不能对一个数字做任何事情(所有的操作符都是为孩子定义的)。您需要为数字的每个子级执行大量的
instanceof
,然后通过强制转换到子类型来处理该情况。或者(我认为更好——Sun就是这样做的)只是对每个子类型都有一个方法,可能利用对+、-、>等运算符的装箱/取消装箱,如果可能的话(所有包装器,而不是BigInteger/BigDecimal或任何自定义类型).

不幸的是,如果不使用if/else块,就无法从包装器类型获取基元类型

问题是,以一种通用的方式实现这样的方法是不可能的。以下是一些看似可能的方法,可以在数字类中找到:

public abstract X getPrimitiveValue();
这太好了,不是吗?但这是不可能的。在
int
float
double
等上不可能有一个抽象的X

public abstract Class<?> getCorrespondingPrimitiveClass();
公共抽象类getCorrespondingPrimitiveClass();
这也无济于事,因为无法实例化基本类

因此,对于所有类型来说,唯一通用的方法就是使用
longValue()
doubleValue()
方法,但无论哪种方法,如果处理错误的类型,都会丢失信息


因此,答案是否定的:java数字层次结构不适合以通用方式解决此类问题。

如果它实际上只是将参数与同一类型参数的另一个值进行比较,那么您可以执行以下操作(为了简单起见,只需添加
tx


publicstatic始终可以选择使用模式接口处理未知数据。这就是排序与比较器接口的工作方式。您应该使用evaluate(T number)方法创建并添加作为方法参数的函数接口Evaluator,并确定方法外的评估逻辑。您还可以从helper类创建一些示例,比如Evaluators::IntegerEvaluator,它将处理整数并向客户机建议它们。

Sry for my eng

因此,如果该方法要接受一个double或一个整数,那么我需要两个具有不同签名的方法,或者我遗漏了什么吗?@Mr\R:如果使用Java 5,则自动装箱会将其转换为double和integer,两者都实现数字。利用多态性,只需提供一个
求值(数字)
methodRelated:。
   public static <T extends Number & Comparable<? super Number>> int evaluate(T inputNumber, T x) {
          if (inputNumber.compareTo(x) > 0) { ... }
   }