在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/