为什么java.lang.Integer不扩展java.lang.Long?

时间:2015-02-15 06:51:15

标签: java

可以将整数值分配给long变量。 可以将整数值自动装箱到Long引用变量中。 但是无法将Integer对象分配给Long引用变量。

我的视图是整数/整数是长/长支持的特定值范围。

所以层次结构应该是Integer extends Long和Long扩展Number。

邀请观点。

2 个答案:

答案 0 :(得分:7)

Long包含long成员(value),其中包含Long的值。

如果IntegerLong的子类,Integer将使用基类的long成员,这是浪费的(因为long占用的字节数是int)的两倍,或者忽略它并使用自己的int成员,这会更浪费(因为在这种情况下,Integer类将同时包含int成员和基类的long成员。)

原始类型的盒装版本应该尽可能高效(因为在某些情况下你被迫使用它们,例如Collection s,它们不能直接保存基元)。因此,任何会增加Integer类存储的类层次结构似乎都是个坏主意。

答案 1 :(得分:4)

原因很简单:如果Integer扩展为Long,那么Integer的实例也将 Long的实例:

Integer i = 0;
if (i instanceof Long) 
    // yes! oops... Integer would be a Long

显然,这不是数学上的情况,不应该是这种情况。

不要将共享一系列值的类型与使类型共享类层次结构的情况混淆。


关于存储等的讨论是实现细节,与此问题所涉及的语言设计注意事项无关。