2016-04-29 54 views
2

我有三類:鑄造超類的Java

public abstract class X{ 
    .... 
} 

public class Y extends X{ 
    clone(){} 
     ..... 
} 

public class Z extends X{ 
    clone(){} 
    ..... 
} 

我有一個Set<X> set包含Z或Y的對象。如果我想克隆該集合中的某個元素,我需要使用ifs嗎?

for(X x:set){ 
    if(x.getClass().getSimpleName().equals("Y")){ 
     Y n = (Y) x 
     n.clone(); 
    } 
} 

我想知道是否有這樣做

+1

也許我失去了一些東西,但你不能添加一個抽象方法,以X級?像'public abstract void clone();'?然後你可以在你的循環中執行'x.clone();'而不用強制轉換,它將使用重寫的Z和Y類的'clone'方法。 –

+0

'if(x.getClass()== Y.class)'更簡單,更健壯 - 可以有很多叫做'Y'的類,但是你只能用'(Y)'來投射它們中的一個。但是你也可能會發現'x instanceof Y'也更容易 - 它不完全相同 - 它也匹配'Y'的子類。 –

+0

正如Kevin所說,如果你的主要意圖是調用clone(),你應該添加一個抽象方法clone()。然後,在你的循環中,你不需要將你的對象投射到你的子類。 – Aakash

回答

0

如果你只是想克隆Y對象一個簡單的方法,是使用if大概是這裏最簡單的方法,你應該使用instanceof

for(X x:set){ 
    if(x instanceof Y)){ 
     Y n = (Y) x 
     n.clone(); 
    } 
} 
0

使X類實現Cloneable。然後按照建議使用instanceof,在對象上調用clone()。

+0

OP要求克隆「某一元素」。也許你想編輯你的答案? – Aakash