Java 比较未知整数类型的数字对象

Java 比较未知整数类型的数字对象,java,casting,Java,Casting,我试图比较两个运行时类型未知的对象,但至少可以保证该类型是某种形式的Number。有没有一种方法可以比较基类为Number的对象,而不显式地将该对象强制转换为Java的一种整数类型 例如: objectobject1=(整数)5; objectobject2=(整数)6; 如果(对象1>对象2){ //显然不会编译 } 如果((编号)对象1>(编号)对象2){ //这当然也不会编译 } 我认为实现这一点的唯一方法是使用instanceof检查每个整数类型,并执行显式转换。但也许有一种更干净的方

我试图比较两个运行时类型未知的
对象
,但至少可以保证该类型是某种形式的
Number
。有没有一种方法可以比较基类为
Number
对象
,而不显式地将该对象强制转换为Java的一种整数类型

例如:

objectobject1=(整数)5;
objectobject2=(整数)6;
如果(对象1>对象2){
//显然不会编译
}
如果((编号)对象1>(编号)对象2){
//这当然也不会编译
}

我认为实现这一点的唯一方法是使用
instanceof
检查每个整数类型,并执行显式转换。但也许有一种更干净的方法可以做到这一点。

如果您知道它们将是数字,您可以使用:

Object object1 = Integer.valueOf(5);
Object object2 = Float.valueOf(6);

Number number1 = (Number) object1;
Number number2 = (Number) object2;

if (number1.doubleValue() < number2.doubleValue()) {
  System.out.println("number1 < number2");
}
object1=Integer.valueOf(5);
objectobject2=Float.valueOf(6);
Number number1=(Number)object1;
Number number2=(Number)object2;
if(number1.doubleValue()

当然,您也可以进行内联铸造。

只有两种“整数”类型的
Number
Integer
Long
,而
整数可以安全地表示为
Long

Number
类型具有该方法,因此您可以安全地强制转换到
Number
并比较调用该方法的结果:

if (((Number)object1).longValue() > ((Number)object2).longValue())

要比较某事,你必须知道怎么做。所以你不能拿未知的东西和其他东西比较

运算符<>仅为基元类型定义


要比较的对象实现可比较的接口。您可以检查对象是否实现了它,并调用compareTo方法来比较相同类型的对象。所有常见的java数字类型(Integer、Short、BigDecimal)都实现了可比性。

用数字类型的泛型定义一个方法如何?我认为将所有类型都视为双精度不会造成任何损失。这是否适用于
Long
?我的理解是,它们可以是任何数字,包括Float和Double。有了long,你可能会失去精确性。我想这是一个失去什么的问题。将6.5与6或非常大但始终为整数的数字进行比较。如果类型为
Double
,则转换为long不会丢失该精度吗?@user0000001实际上相反,使用Double会丢失精度。问题指定了整数类型,这意味着
整数
。大的
Long
值不能准确地表示为双精度值,并且将它们转换为双精度值时会失去精度。Java使用的“数字”部分最多只使用53位,因此大于2^54的长值在转换为双精度时只是近似值。