繁体   English   中英

为什么铸造方向在原始类型中从大到小而在对象中从小到大?

[英]Why casting direction is big to small in primitive types and small to big with objects?

在 Java 中,我们需要在将 double(memory 尺寸大)转换为 Integer(ZCD691B4957F098CD281Z 尺寸较小)时进行转换

int x = (int) 4.3;

但是在对象的情况下,如果父 class 是“哺乳动物”(在 memory 大小中小),其子类是“人类”(在 memory 大小中大),因为获得了更多属性然后哺乳动物

然后

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

但从小到大的转换

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

提前致谢。

铸造与 object 的大小无关:它与变量的范围有关

“范围”是指变量可以包含的各种不同值。 如果您从一个变量分配给另一个变量,其范围是第一个变量的超集,则不需要强制转换,因为您知道分配是可以的。 但是,当您将一个变量分配给另一个其范围是子集的变量时,您确实需要进行强制转换,因为分配可能是不可能的。

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

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

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

当您使用原始类型时,您必须在有可能丢失信息时显式地强制转换。 例如, long是 64 位, int是 32。在int中转换long会导致数据丢失(在这种情况下是 32 位)。

在处理对象时,这与多态性有关。 编译器能够确保每个Human都是Mammal 这里没问题。 但无法保证每一个Mammal都是Human 您必须显式转换才能转换引用类型。

您可以将显式转换视为对编译器说“我知道您无法确保此数据转换是安全的,但我知道我在做什么”的一种方式。

  1. 如果是原语 memory 起作用。如果您要像示例中那样将 double 存储到 int 中,则与 integer 相比,double 需要更多的 memory。你知道你在做什么,所以编译器让它去做。
  2. 在 object 的情况下,没有 memory 的情况。只是多态性起作用。所以你可以将子类 object 变成超类型。

    希望你能得到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM