在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