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

时间:2019-04-03 16:26:13

标签: java compilation

要引用Array中的特定对象,我需要将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

为什么需要强制转换?

4 个答案:

答案 0 :(得分:2)

在Java中,有upcastingdowncasting的概念。向上转换意味着强制转换为超类型,而向下转换意味着强制转换为子类型。

只要存在Is-A关系,您就可以进行向上转换而不会造成任何伤害。但这是垂头丧气的,需要加以解决。

例如,您拥有People array,并且由于EmployeeManager这两个类都是extends People,因此People数组可以存储这两个类别。现在,当您执行Employee ref2 = people[1];时,编译器并不知道实际上是Employee,因为当Manager类也扩展People时,in成为Manager的可能性相同。因此,您需要显式提供一个强制转换,以告知编译器您知道自己在做什么,而无需给出任何编译错误。但是,如果在运行时出现任何问题,则会抛出ClassCastException

答案 1 :(得分:1)

由于编译器不知道people[1]Employee,所以不进行强制转换就不会编译它。

来自Java tutorial. Casting Objects

  

我们可以告诉我们承诺通过显式强制转换Employee分配给people[1]的编译器。

     

此强制类型转换插入运行时检查,以确保为people[1]分配了Employee,以便编译器可以安全地假定people[1]Employee。如果people[1]在运行时不是Employee,则会引发异常。

查看更多Casting variables in Java

答案 2 :(得分:1)

变量people的类型为PersonPerson[] people = Person[5];type[] people = new instance-实例也可以是扩展type的子对象)。

这里Employee ref2 = people[1];的编译器将people视为Person,您需要在编译器中说它也可以是Employee(因为Employee扩展了{{1} })。

有关此主题的更多信息,请访问:https://www.baeldung.com/java-type-casting

答案 3 :(得分:0)

因为您有一个 Employee 引用,并尝试使用类型为 Person 的值实例化它。

员工人员,但是人员不一定是员工。 纠正我,如果我错了。