在Java中变量赋值期间是否有用途投射?在Java中赋值期间投射
例如,我有两个班,人员和学生,从人继承:
- 人| -id:int
- 学生 - >人员| -gpa:双
然后在主我有以下代码:
Student S = new Student(1, 4.00);
Person P = (Student)S;
System.out.println(P.getId() + " " + ((Student)P).getGpa());
的IntelliJ告诉我,在P = (Student)S
铸造是多余的,如果我调用getGpa方法时,只投它的工作原理:
Student S = new Student(1, 4.00);
Person P = S;
System.out.println(P.getId() + " " + ((Student)P).getGpa());
但是,它给了我一个错误,如果我任职期间投下但不是当我再次打电话getGpa:
Student S = new Student(1, 4.00);
Person P = (Student)S;
System.out.println(P.getId() + " " + P.getGpa());
所以我的问题是 - 是否有一种情况下,在转让期间铸造是有用的?或者它是允许的,但总是多余的,因为你仍然必须告诉编译器每个方法调用你正在转换为子类型?
谢谢你的帮助。
是关于在转换过程中关于转换的一般问题,还是关于将某些东西转换为原来的类型的问题。如果问题是“它是否已经是多余的东西”,答案是肯定的。 'S'是'Student'类型,所以将它转换为'Student'什么也不做。 'P'的类型是'Parent',所以将它转换为'Student'就可以做一些事情。 –
这是多余的,因为学生*是-a *人,所以不需要演员。铸造任务的一种情况是'something =(Something)foo();'。 foo'返回一个Object。 – ChiefTwoPencils
@DavidSchwartz我问的是在对象之间而不是基元之间进行投射 - 所以我认为你只能基于继承关系进行向上/向下投射。在这种情况下,我不会投射到相同的类型,我将投射到学生,以便我可以访问Student中的getGpa方法。所以有一点,但我特别要问,为什么甚至允许有人做'P =(Student)S',如果我不得不在调用getGpa方法时再次抛出它。 “ – allstar