我可以用Java编号做什么?

时间:2013-09-04 14:14:45

标签: java numbers

库中的函数返回Number。我无法将其转换为可用的任何内容(“无法从Number转换为int”)并且无法使用String.format进行打印。如何处理Number

7 个答案:

答案 0 :(得分:5)

  

我无法将其转换为可用的任何内容

当然可以!

void doSomething(Number myNumber) {
    int intNumber = myNumber.intValue();
    double dblNumber = myNumber.doubleValue();
    // Now do something useful
}

Number类背后的想法是为内置数值类型提供一个公共超类。它使您可以更灵活地传递数字,以便可以推迟决定使用何种类型,直到需要数值为止。

当数据检索的代码与使用数字数据的代码分开时,这变得特别有用,因为检索代码可以按照无类型数字运行,而不用担心特定类型。

答案 1 :(得分:2)

你可以

  • 将其投射到其基础类型
  • 将其转换为基本类型
  • toString()用它。例如String.format("%s",number);

一般情况下,它不是那么有用的恕我直言。

我更喜欢使用double作为"超级原语"类型。或者BigDecimal / BigInteger,如果那不是一个选项。

  

但是,如果这些功能仍然存在,为什么不能进行演绎呢?

Number是对象的引用,而不是对象。您可以更改引用的类型,但不能使用强制转换来更改或创建新对象。

答案 2 :(得分:2)

有四种方法可以将对象转换为您真正想要的对象:intValuelongValuefloatValuedoubleValue。只要选择最适合你的那个,就可以了。

答案 3 :(得分:1)

你会注意到基元的引用类型都实现了像intValue()这样的方法(它们几乎都以相同的方式实现),这些方法在Number接口上是抽象的。 (

例如,Integer(扩展Number)有

/**
 * Returns the value of this {@code Integer} as a
 * {@code long}.
 */
public long longValue() {
    return (long)value;
}

/**
 * Returns the value of this {@code Integer} as a
 * {@code float}.
 */
public float floatValue() {
    return (float)value;
}

/**
 * Returns the value of this {@code Integer} as a
 * {@code double}.
 */
public double doubleValue() {
    return (double)value;
}

因此,当您引用Number时,您可以执行

Number n = ...;
int value = n.intValue();

它将以多态方式调用动态类型的方法。

您可以随时查看Number的类型,然后选择

Number n = ...;
if (n instanceof Integer) 
    Integer i = (Integer) n;

答案 4 :(得分:1)

Number是Java中用于声明“数字”类型的许多其他类的超类。它主要用于泛型,当你需要在Collections中使用超类的引用来利用多态时:

class A<T extends Number>{
}

List<Number> list = new ArrayList<>();
list.add(new Integer("1"));
list.add(new Double("1.1"));
...

答案 5 :(得分:0)

   Number n = library.function();
   int i = n.intValue();
   System.out.print(i);

答案 6 :(得分:0)

您无法将其投放到int,但您可以将其投放到Integer(假设它是对Integer的引用)(并且Integer只是一个int的包装类,Java使用unboxing,允许您基本上使用Integer作为int

不起作用:

Number n = 3;
System.out.println(3 + (int)n);

使用:

// autoboxing int(3) to Integer(3) and creating a reference of type Number to it
Number n = 3;

// unboxing Integer(3) to int(3) and adding it to int(2)
System.out.println(2 + (Integer)n);

正如cHao所提到的,如果ClassCastException未引用Number,您将获得Integer(例如,它也可以引用Double) 。为避免这种情况,您可以检查
在尝试施放之前if (n instanceof Integer)

或者您可以使用其他一些答案中建议的xxxValue函数(这可以防止需要检查它的实例,因为所有类都需要实现所有xxxValue函数(因为它们在abstract中是Number,虽然理论上可以实现这些以抛出异常,但我怀疑标准API中的任何类都会这样做。)

我建议在<{1}}函数之上构建的原因是因为这会使您想要显式的类型,而不是只是愉快地返回一个不同类型的值,尽管它可能不是你想要的。考虑这个例子:

xxxValue