2013-06-25 78 views
1

我有一個庫,它使用一個數據類型X作爲輸入來構建一個HashMap。它是JGraphT庫。現在,我有兩種類型的X.Y和Z.所以X是一個超級類。 Y和Z是X的子類。現在X是一個頂點。 Y和Z是特定類型的頂點。現在,當我在JGraphT中構建一個圖並獲得圖中任何邊的源頂點時,我將它作爲數據類型X.我想將它轉換爲數據類型Y和Z,但是簡單的paranthesized類型轉換獲勝沒有工作。我知道你不能將這種方式從超類對象轉換爲子類對象。但是有什麼辦法可以達到這個目的嗎?如何實現將超類對象轉換爲子類對象的效果?

回答

0

如果通話結果實際上是YZ的實例,則可以使用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)。

+0

嗯,我把你的相同的例子:(f.ck!xD – nachokk

0

我想將其轉換爲數據類型Y和Z,但簡單的括號內的類型轉換將不起作用。

大概是 「簡單帶括號的類型轉換」 是指這樣的事:

X myX = ... 
Y myY = (Y) myX; 

這被稱爲 「類型轉換」。

它說:「如果myX確實是Y的一個實例,則將其分配給myY」。如果myX所引用的對象不是Y的實例,則類型轉換將失敗(運行時異常)。

我知道你不能將這種方式從超類對象轉換爲子類對象。

如果「轉換」,你的意思是不同上述類型轉換,那麼這是正確的。

但是有什麼辦法可以達到這個目的嗎?

沒有將對象「轉換」爲與其真實類型或其真實類型的超類型不同的類型的一般方法。這種「轉換」只能通過編寫一些方法來完成任務來完成,並且必然需要創建一個不同的新對象。這是否合理(甚至可能)取決於應用程序。 (例如,如果實例表示圖中的一個節點,那麼創建一個新對象的「轉換」會給你一些圖的其他節點不會引用的東西,這很容易中斷一些東西。)


1 - 您可以使用instanceof測試,以防範異常,但這不會讓你強制轉換對象的類型,這......不是的成員。要解決這個

0

一種方法是添加一個靜態方法來Y和Z,你想要做什麼:

class Y extends X { 
    ... 
      public static Y toYType(X original) { 
       .... 
      } 
    ... 
    } 

反正你不能「轉換」在同一個對象的子類,認爲關於這個:Y是X的專用類型,可能帶有額外的字段;如果你能把X轉換成Y,這個額外的場應該如何填充?你需要明確地創建一個新的對象Y

0

我知道你不能將這種方式從超類對象轉換爲子類對象。

這是正確的,這被稱爲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); 

但它是相當遠離簡單的類型...

相關問題