java - 为什么转换方向在原始类型中从大到小,在对象中从小到大?

标签 java oop object casting primitive-types

在Java中 在将 double(内存大)转换为 Integer(内存小)时,我们需要强制转换

int x = (int) 4.3;

但是在对象的情况下,如果父类是“哺乳动物”(内存大小小),它的子类是“人类”(内存大,因为比哺乳动物有更多的属性)

然后

Mammal m = new Human(); //works without casting

但从小到大的转化

Human h = (Human) m ; // needs casting 

提前致谢。

最佳答案

转换与对象的大小无关:它与变量的范围有关。

“范围”是指变量可以包含的不同值的种类。如果你从一个变量赋值给另一个变量,其范围是第一个变量的超集,你不需要强制转换,因为你知道赋值是正确的。但是,当您从一个变量赋值给范围是子集的另一个变量时,您确实需要强制转换,因为赋值可能无法实现。

假设您有两个容器:一个塑料桶和一个铁丝购物篮,大小相同。显然,任何你能放在铁丝篮里的东西,你都可以放在浴缸里。但并不是所有可以放在浴缸里的东西都可以放在篮子里。一堆苹果,你可以。但是一堆葡萄干,你不能——它们会从篮子的洞里掉下来。因此,浴缸可容纳的元素范围大于篮子可容纳的元素范围,即使两者的尺寸相同。

在这个类比中,转换就像检查您要移动的东西是否适合新容器。将东西从篮子移到浴缸时不需要检查,但从浴缸移到篮子时需要检查,否则水果会弄得满地都是。

在您的特定情况下,我们知道每个人都是哺乳动物,但并非每个哺乳动物都是人类,因此 Mammal 类型变量的范围大于 Human 类型变量的范围。我们也知道double的取值范围(大约2^1024 - -(2^1024))大于int的取值范围(2^31-1 - -2^31)。因此,在任何一种情况下,从前者分配给后者都需要强制转换,但从后者分配给前者则不需要。

关于java - 为什么转换方向在原始类型中从大到小,在对象中从小到大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7037512/

相关文章:

java - 防止应用程序在读取 NFC 标签时暂停

javascript - jQuery 库代码

java - Java中的对象变量是指针吗?

java - 为什么 hashcode() 返回相同的整数?

java - HttpPost 中的 VIEWSTATE 值

Java:过度使用反射?

C++ 使用 scoped_ptr 作为成员变量

java - 如何将此事件方法从 C# 转换为 java?

python - Python 中的动态对象类似于 AS3

java - 如何结合 PowerMock 和 Robolectric