2016-04-29 8 views
2

Ich habe drei Klassen:eine übergeordnete Klasse Java Casting

public abstract class X{ 
    .... 
} 

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

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

Ich habe eine Set<X> set welche Objekte Z oder Y umfasst. Was, wenn ich ein bestimmtes Element des Sets klonen möchte, muss ich Wenns verwenden?

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

Ich möchte wissen, ob es einen einfacheren Weg, um dieses

+1

Vielleicht fehlt mir etwas, aber kannst du der X-Klasse keine abstrakte Methode hinzufügen? Wie 'public abstract void clone();'? Dann können Sie einfach 'x.clone();' in Ihrer Schleife ohne Casting ausführen, und es wird die überschriebene 'clone'-Methode der Z- und Y-Klassen verwenden. –

+0

'if (x.getClass() == Y.class)' ist einfacher und robuster - es gibt viele Klassen namens 'Y', aber Sie können nur eine davon mit' (Y) 'darstellen. Aber Sie können auch finden, dass x x instanceof Y auch einfacher ist - es ist nicht * genau * das gleiche - dies entspricht auch Unterklassen von "Y". –

+0

Wie Kevin sagte, sollten Sie eine abstrakte Methode 'clone()' hinzufügen, wenn Sie 'clone()' aufrufen wollen. Innerhalb Ihrer Schleife müssen Sie Ihr Objekt dann nicht in Ihre Kindklasse umwandeln. – Aakash

Antwort

0

tun, wenn Sie nur Y Objekte klonen möchten, ja eine if verwendet, ist wahrscheinlich der einfachste Weg, hier und Sie sollten instanceof verwenden:

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

Machen Sie die Klasse X implementiert Cloneable. Rufen Sie dann clone() für das Objekt auf, indem Sie wie vorgeschlagen instanceof verwenden.

+0

OP bat um "ein bestimmtes Element" zu klonen. Vielleicht möchten Sie Ihre Antwort bearbeiten? – Aakash