Number类的目的是什么?

时间:2011-12-29 18:28:10

标签: java

我经常看到像Java Generics and adding numbers together这样的问题,答案通常可归结为这样一个事实,即您无法对Number本身做任何事情。

Sourcecode显示Number主要是一个空壳,与示例对象不同。

此时我无法想到使用Number而不是具体子类型具有显着(如果有)优势的情况。通常我会从Number开始,但在实际使用它时会遇到问题并将其更改为子类型。但这可能只是我有限的经历。

所以我想知道,除了那些没有实际功能的其他数字类型的共同祖先之外,这个类的目的是什么?

5 个答案:

答案 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)

它允许以下内容:

  1. 执行(可能有损)从一种类型到另一种类型的转换。
  2. 允许编写客户端代码,以便在存储较小值时使用更精确的表单(longdouble)。
  3. 允许中间代码传递数字而不会过于具体(Long)或过于抽象(Object)。
  4. 排序允许代码从固定精度(Integer)扩展到无限精度(BigInteger)......但要做到这一点,他们应该将算术运算添加到基类。
  5. 允许客户端代码使用值而不关注可变性(LongAtomicLong),前提是它不存储对象的引用。
  6. 允许数字表示的替代实现,例如编写您自己的Fraction,可以表示为double
  7. 允许使用光标样式的API,例如IntegerCursor。但请记住,使用此技术时,您需要确保客户端代码不会存储对该数字的引用。

答案 2 :(得分:0)

因为所有Java数字类型都扩展了Number,而Number提供了所有其他数字格式的转换方法,所以Java程序员可以始终确保可以安全地从一种数字类型转换为另一种数字类型。这是一个非常有用的属性。

答案 3 :(得分:0)

由表示数字基元类型的所有类扩展的抽象类,例如ByteShortIntegerLongFloat和{{ 3}}。该类包含将对象值转换为任何其他数字类型的抽象方法。所有这些方法都被数字子类覆盖。它还包含将数字类型转换为字符串的方法,反之亦然。 Double

public abstract class java.lang.Number extends java.lang.Object implements java.io.Serializable
{
     //......
}

See

答案 4 :(得分:0)

我希望它至少实现了Comparable,但我确实看到Integer.compareTo(SomeNumberType)可能与SomeNumberType.compareTo(Integer)不一致;这就是为什么只有子类实现Comparable。