2011-12-29 78 views
2

我经常看到类似Java Generics and adding numbers together这样的问题,答案通常归结为您无法真正对Number本身做任何事情。Number类的用途是什么?

Sourcecode表明Number大多不像示例对象的空壳。

在这一点上,其中使用Number而不是一个具体亚型我想不出的情况有显著(如果有的话)的优势。通常我会从Number开始,但在实际使用它时会遇到问题,并将其更改为子类型。但这可能只是我有限的经验。

所以我想知道,这是什么类的其他然后是数字类型的,没有实际功能的共同祖先的目的是什么?

回答

3

As you can see in the Javadocs,这是一个抽象类。按照定义,那么它的唯一目的是作为其他数字类型的基类。有一组的每一个该子类Number都会有方法(例如,intValue()),以及一个能想象写东西像

if (object instanceof Number) 
    result = ((Number) object).intValue(); 
else if (object instanceof String) 
    result = Integer.parseInt(object.toString()); 

我想这就是它。你还会期待什么?

0

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

+0

安全吗? ;-)不确定。 – 2011-12-29 18:40:01

+0

那么,尽可能安全......至少你不会抛出异常!但是,当然,如果您尝试在不检查范围的情况下不小心转换,或者考虑截断和舍入是否会成为问题,那么您肯定会遇到麻烦。 – Renato 2011-12-29 19:03:18

+2

如果您确实想要安全地执行此操作,请将该值存储为BigDecimal,然后使用各种确切的方法(例如BigDecimal#longValueExact)。如果所需基元的大小无法正确存储值,则会引发异常。 – Saish 2011-12-29 22:51:07

0

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

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

See a long example that uses the Number class

0

嗯,我希望它至少实现可比但我怎么看Integer.compareTo(SomeNumberType)可能无法与SomeNumberType.compareTo(整数)同意;这就是为什么只有子类实现Comparable。

1

它允许进行以下:

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