gpt4 book ai didi

java - 显式类型转换、派生类数组

转载 作者:行者123 更新时间:2023-12-02 00:13:19 25 4
gpt4 key购买 nike

class Animal{ }
class Cat extends Animal{ }

public class Main
{
public static void main(String ab[])
{
Animal[] objAnimal = {new Cat()};
Cat objCat0 = (Cat)objAnimal[0]; // a valid operation.
Cat[] objCatArray = (Cat[]) objAnimal; //not a valid operation.
}
}

我试图了解幕后发生的事情。

为什么 Cat objCat0 = (Cat)objAnimal[0]; 是有效操作,而 Cat[] objCatArray = (Cat[]) objAnimal; 不是有效操作?

最佳答案

Animal[] objAnimal = {new Cat()};

的快捷方式
Animal[] objAnimal = new Animal[] {new Cat()};

这是一个快捷方式

Animal[] objAnimal = new Animal[1];
objAnimal[0] = new Cat();

编译后的代码是相同的。因此,看看最后一个变体,很明显您可以做到

Cat objCat0 = (Cat)objAnimal[0];

因为您之前存储了对 Cat 的引用实例,通过 new Cat() 创建, 至objAnimal[0]

Cat[] objCatArray = (Cat[]) objAnimal;

无效,因为 objAnimal包含对 Animal[] 的引用数组实例,通过 new Animal[1] 创建。事实上有一个Cat存储在一个元素中的引用不会改变数组的类型。可能会有后续的 objAnimal[0] = new Animal();随时。

问题中使用的数组初始值设定项语法是为了方便而存在,但不会改变逻辑。所以

Animal[] objAnimal = {new Cat()};
objAnimal[0] = new Animal();

有效并且

Cat[] objCatArray = (Cat[]) objAnimal;

必须失败,否则您随后可以使用

Cat cat = objCatArray[0];

没有类型转换,尽管有objAnimal[0] = new Animal()的可能性作业。

关于java - 显式类型转换、派生类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58107168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com