库中的函数返回Number
。我无法将其转换为可用的任何内容(“无法从Number转换为int”)并且无法使用String.format
进行打印。如何处理Number
?
答案 0 :(得分:5)
我无法将其转换为可用的任何内容
当然可以!
void doSomething(Number myNumber) {
int intNumber = myNumber.intValue();
double dblNumber = myNumber.doubleValue();
// Now do something useful
}
Number
类背后的想法是为内置数值类型提供一个公共超类。它使您可以更灵活地传递数字,以便可以推迟决定使用何种类型,直到需要数值为止。
当数据检索的代码与使用数字数据的代码分开时,这变得特别有用,因为检索代码可以按照无类型数字运行,而不用担心特定类型。
答案 1 :(得分:2)
你可以
一般情况下,它不是那么有用的恕我直言。
我更喜欢使用double
作为"超级原语"类型。或者BigDecimal / BigInteger,如果那不是一个选项。
但是,如果这些功能仍然存在,为什么不能进行演绎呢?
Number
是对象的引用,而不是对象。您可以更改引用的类型,但不能使用强制转换来更改或创建新对象。
答案 2 :(得分:2)
有四种方法可以将对象转换为您真正想要的对象:intValue
,longValue
,floatValue
和doubleValue
。只要选择最适合你的那个,就可以了。
答案 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