为什么我需要对对象数组中的特定引用进行强制转换?

要引用数组中的特定对象,我需要将int转换为其类型,否则编译器不接受,为什么我需要此转换?


示例:


Person[] people = Person[5];            //Generic Array of specific objects


Employee employee1 = new Employee();    //Employee class extends Person

Manager manager1 = new Manager();       //Manager class extends Person


people[0] = employee1;

people[1] = manager1;



Person ref = people[0];                //OK! it can compile

Employee ref2 = people[1];               //Do not compile

Employee ref2 = (Employee) people[1];      //OK! it can compile

为什么需要演员阵容?


海绵宝宝撒
浏览 113回答 5
5回答

小唯快跑啊

在 Java 中有一个 和 的概念。上嵌意味着转换为超类型,而下嵌意味着转换为子类型。upcastingdowncasting每当有关系时,你都可以毫无伤害地进行升级。但需要注意的是低调。Is-A例如,您有 和 因为 两者 都是 类,因此 People 数组可以存储这两个。现在,当你做编译器不知道它实际上是员工,因为有相等的概率,可以经理作为经理类也扩展了人。因此,您需要显式提供一个强制转换,告诉编译器您知道自己在做什么,并且无需给出任何编译错误。但是,如果在运行时出现任何问题,则将抛出a。People arrayEmployeeManagerextendsPeopleEmployee ref2 = people[1];ClassCastException

慕标琳琳

它不是在没有强制转换的情况下编译的,因为编译器不知道它是 .people[1]Employee来自 Java 教程。铸造对象:我们可以告诉编译器,我们承诺通过显式转换来分配给它。Employeepeople[1]此强制转换将插入一个分配了 的运行时检查,以便编译器可以安全地假定 该检查是 。如果不是 在运行时,将引发异常。people[1]Employeepeople[1]Employeepeople[1]Employee查看更多 Java 中的强制转换变量

倚天杖

变量的类型为 。 ( - 实例也可以是扩展的子项 )。peoplePersonPerson[] people = Person[5];type[] people = new instancetype这里编译器看到,你需要说在编译器它也可以(导致扩展)通过转换。Employee ref2 = people[1];peoplePersonEmployeeEmployeePerson你可以阅读更多,关于这个主题,在这里: https://www.baeldung.com/java-type-casting

哔哔one

变量的类型为 。 ( - 实例也可以是扩展的子项 )。peoplePersonPerson[] people = Person[5];type[] people = new instancetype这里编译器看到,你需要说在编译器它也可以(导致扩展)通过转换。Employee ref2 = people[1];peoplePersonEmployeeEmployeePerson你可以阅读更多,关于这个主题,在这里: https://www.baeldung.com/java-type-casting

白衣非少年

因为您有一个员工引用,并且您尝试使用类型为 Person 的值对其进行实例化。员工是一个人,但一个人不一定是员工。如果我错了,请纠正我。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java