2016-04-29 2 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();' в своем цикле без кастинга, и он будет использовать переопределенный метод clone для классов Z и Y. –

+0

'if (x.getClass() == Y.class)' более простой и более надежный - может быть много классов, называемых 'Y', но вы можете использовать только один из них с помощью (Y)'. Но вы также можете обнаружить, что 'x instanceof Y' тоже проще - это не * точно * то же самое - это также соответствует подклассам' Y'. –

+0

Как сказал Кевин, если ваше основное намерение состоит в вызове 'clone()', вы должны добавить абстрактный метод 'clone()'. Затем внутри цикла вам не нужно бросать свой объект в ваш дочерний класс. – Aakash

ответ

0

Если вы хотите клонировать Y объекты, да с помощью if, вероятно, самый простой способ здесь, и вы должны использовать instanceof:

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

Сделайте класс X орудием Cloneable. Затем просто вызовите clone() на объект, используя instanceof, как это было предложено.

+0

ОП попросил клонирование «определенного элемента». Может быть, вы хотите отредактировать свой ответ? – Aakash

Смежные вопросы