我经常看到像Java Generics and adding numbers together这样的问题,答案通常可归结为这样一个事实,即您无法对Number
本身做任何事情。
Sourcecode显示Number
主要是一个空壳,与示例对象不同。
此时我无法想到使用Number
而不是具体子类型具有显着(如果有)优势的情况。通常我会从Number
开始,但在实际使用它时会遇到问题并将其更改为子类型。但这可能只是我有限的经历。
所以我想知道,除了那些没有实际功能的其他数字类型的共同祖先之外,这个类的目的是什么?
答案 0 :(得分:3)
As you can see in the Javadocs,这是一个抽象类。根据定义,它的唯一目的是作为其他数字类型的基类。有一组方法(例如,intValue()
),每个Number
子类都有,并且可以想象写一些类似
if (object instanceof Number)
result = ((Number) object).intValue();
else if (object instanceof String)
result = Integer.parseInt(object.toString());
我认为就是这样。您还期待什么?
答案 1 :(得分:1)
它允许以下内容:
long
或double
)。Long
)或过于抽象(Object
)。Integer
)扩展到无限精度(BigInteger
)......但要做到这一点,他们应该将算术运算添加到基类。 Long
与AtomicLong
),前提是它不存储对象的引用。Fraction
,可以表示为double
。IntegerCursor
。但请记住,使用此技术时,您需要确保客户端代码不会存储对该数字的引用。答案 2 :(得分:0)
因为所有Java数字类型都扩展了Number,而Number提供了所有其他数字格式的转换方法,所以Java程序员可以始终确保可以安全地从一种数字类型转换为另一种数字类型。这是一个非常有用的属性。
答案 3 :(得分:0)
由表示数字基元类型的所有类扩展的抽象类,例如Byte,Short,Integer,Long,Float和{{ 3}}。该类包含将对象值转换为任何其他数字类型的抽象方法。所有这些方法都被数字子类覆盖。它还包含将数字类型转换为字符串的方法,反之亦然。 Double
public abstract class java.lang.Number extends java.lang.Object implements java.io.Serializable
{
//......
}
答案 4 :(得分:0)
我希望它至少实现了Comparable,但我确实看到Integer.compareTo(SomeNumberType)可能与SomeNumberType.compareTo(Integer)不一致;这就是为什么只有子类实现Comparable。