要引用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
为什么需要强制转换?
答案 0 :(得分:2)
在Java中,有upcasting
和downcasting
的概念。向上转换意味着强制转换为超类型,而向下转换意味着强制转换为子类型。
只要存在Is-A
关系,您就可以进行向上转换而不会造成任何伤害。但这是垂头丧气的,需要加以解决。
例如,您拥有People array
,并且由于Employee
和Manager
这两个类都是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
,则会引发异常。
答案 2 :(得分:1)
变量people
的类型为Person
。 Person[] 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 的值实例化它。
员工是人员,但是人员不一定是员工。 纠正我,如果我错了。