我有一個庫,它使用一個數據類型X作爲輸入來構建一個HashMap。它是JGraphT庫。現在,我有兩種類型的X.Y和Z.所以X是一個超級類。 Y和Z是X的子類。現在X是一個頂點。 Y和Z是特定類型的頂點。現在,當我在JGraphT中構建一個圖並獲得圖中任何邊的源頂點時,我將它作爲數據類型X.我想將它轉換爲數據類型Y和Z,但是簡單的paranthesized類型轉換獲勝沒有工作。我知道你不能將這種方式從超類對象轉換爲子類對象。但是有什麼辦法可以達到這個目的嗎?如何實現將超類對象轉換爲子類對象的效果?
回答
如果通話結果實際上是Y
或Z
的實例,則可以使用instanceof
。
X x = someCall();
if (x instanceof Y) {
Y y = (Y)x;
y.doSomething();
}
else
if (x instanceof Z) { ... }
如果返回x只是一個X和實際上不是一個Y或Z,那麼你就需要基於X的數據(可能通過一個構造函數的X實例來創建自己的Y或Z作爲一個arg)。
我想將其轉換爲數據類型Y和Z,但簡單的括號內的類型轉換將不起作用。
大概是 「簡單帶括號的類型轉換」 是指這樣的事:
X myX = ...
Y myY = (Y) myX;
這被稱爲 「類型轉換」。
它說:「如果myX
確實是Y
的一個實例,則將其分配給myY
」。如果myX
所引用的對象不是Y
的實例,則類型轉換將失敗(運行時異常)。
我知道你不能將這種方式從超類對象轉換爲子類對象。
如果「轉換」,你的意思是不同上述類型轉換,那麼這是正確的。
但是有什麼辦法可以達到這個目的嗎?
沒有將對象「轉換」爲與其真實類型或其真實類型的超類型不同的類型的一般方法。這種「轉換」只能通過編寫一些方法來完成任務來完成,並且必然需要創建一個不同的新對象。這是否合理(甚至可能)取決於應用程序。 (例如,如果實例表示圖中的一個節點,那麼創建一個新對象的「轉換」會給你一些圖的其他節點不會引用的東西,這很容易中斷一些東西。)
1 - 您可以使用instanceof
測試,以防範異常,但這不會讓你強制轉換對象的類型,這......不是的成員。要解決這個
一種方法是添加一個靜態方法來Y和Z,你想要做什麼:
class Y extends X {
...
public static Y toYType(X original) {
....
}
...
}
反正你不能「轉換」在同一個對象的子類,認爲關於這個:Y是X的專用類型,可能帶有額外的字段;如果你能把X轉換成Y,這個額外的場應該如何填充?你需要明確地創建一個新的對象Y
我知道你不能將這種方式從超類對象轉換爲子類對象。
這是正確的,這被稱爲downcasting
,只有在某些情況下才允許和安全。有效垂頭喪氣的 實例:實現你的意思
X x = (X)new Y(); // x is the result of upcasting of an object
// of type Y in the 1st place
Y y = (Y)x; // Allowed and safe in this specific case.
的一種方式,是實現拷貝構造函數:
class X {
public int x, y, z;
public X() {
}
// Here the default copy cstor
public X(X src_x) {
this.x = src_x.x;
this.y = src_x.y;
this.z = src_x.z;
System.out.println("Cstor base copy called");
}
}
class Y extends X {
public int u;
// Here the copy cstor: sets x, y, z from x to this(type Y)
public Y(X x) {
super(x);
}
}
class Z extends X {
public int v;
// Here the copy cstor
public Z(X x) {
super(x);
}
}
然後,你可以這樣做:
X x = new X();
x.x = 1;
x.y = 2;
x.z = 3;
Y y = new Y(x);
但它是相當遠離簡單的類型...
- 1. 將超類的對象轉換爲子類
- 2. Java,是否有可能將對象從子類轉換爲超類對象
- 3. 如何類轉換爲實例對象
- 4. 如何將類對象轉換爲通用對象類型?
- 5. 如何將對象從類轉換爲超類
- 6. 是否有效將對象從基類轉換爲子類
- 7. 如何將超類對象值複製到子類對象值?
- 8. 如何將JSONObject轉換爲類對象?
- 9. 如何將類mysqli_result的對象轉換爲json對象
- 10. 將對象類型轉換爲Objective-C中的子類對象類型C
- 11. 將類類型對象轉換爲Intptr
- 12. 如何將「ppp」對象轉換爲多類型對象?
- 13. 如何將對象類型列表轉換爲對象數組
- 14. 如何通過類的名稱將unbox對象轉換爲實際對象
- 15. 如何使用Type對象將對象類型的對象轉換爲Type對象引用的類型
- 16. 如何將類的對象「HTMLInternalDocument」「XMLInternalDocument」轉換爲類「字符」的對象? (scrapeR包)
- 17. 超類對子類對象的引用
- 18. Gson:如何使用gson將json對象轉換爲子類對象
- 19. 將對象轉換爲不同的類
- 20. 如何將超類轉換爲子類
- 21. 如何將python dict對象轉換爲java等效對象?
- 22. 如何自動將對象引用轉換爲實例類型?
- 23. 如何將ctypes c_void_p對象轉換爲實際類型?
- 24. 如何將對象實例轉換爲泛型類型?
- 25. 將子類或超類對象傳遞給方法(期待超類對象)
- 26. 如何將一個對象轉換爲由其超類繼承的類?
- 27. java界面中的通用方法如何將超級對象轉換爲具體的子類對象?
- 28. 將類轉換爲片段對象
- 29. 將對象類型{char []}轉換爲char []
- 30. 將JSON對象轉換爲Typescript類
嗯,我把你的相同的例子:(f.ck!xD – nachokk