У меня есть три класса:Кастинг суперкласса 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();
}
}
Я хочу знать, если есть более простой способ сделать это
Возможно, мне что-то не хватает, но не можете ли вы добавить абстрактный метод к X-классу? Подобно 'public abstract void clone();'? Тогда вы можете просто выполнить 'x.clone();' в своем цикле без кастинга, и он будет использовать переопределенный метод clone для классов Z и Y. –
'if (x.getClass() == Y.class)' более простой и более надежный - может быть много классов, называемых 'Y', но вы можете использовать только один из них с помощью (Y)'. Но вы также можете обнаружить, что 'x instanceof Y' тоже проще - это не * точно * то же самое - это также соответствует подклассам' Y'. –
Как сказал Кевин, если ваше основное намерение состоит в вызове 'clone()', вы должны добавить абстрактный метод 'clone()'. Затем внутри цикла вам не нужно бросать свой объект в ваш дочерний класс. – Aakash