Как грамотно преобразовать/кастинговать одного наследника к другому?
Меня интересует такой вопрос: как можно кастинговать одного наследника к другому, если у первого в отличии от второго есть коллекция с его же типом, а у второго коллекции нет, но есть по-своему переопределенный toString()
Как известно - преобразовать от наследника к родителю возможно так как есть общая сигнатура и выделенная память на наследника и при кастинге еще есть "остаток".
Но как можно приобразовать от родителя к наследнику?
Вариант c пересечиванием общих полей из наследников меня не устраивает так как мне кажется, что это излишняя работа и возможно все сделать гораздо-проще и лаконичней.
P.S. Буду рад любой помощи, а так же комментариям к данному вопросу
окей, но как у первого- так и у второго есть общий родитель. как сделать, чтобы они остались, а особенности реализаций были просто непроинициализированы?
По-факту задача состоит в кастинге родителя в наследника
svladys, привести ссылку базового типа к наследующему можно только в том случае, если объект по ссылке реализует этот тип.
class Wolf {}
class Hound extends Wolf {}
class Pug extends Wolf {}
Wolf someDog = new Pug();
// Так можно
Pug pug = (Pug) someDog;
// А так нельзя
Hound hound = (Hound) someDog;
Elmo Sputterspark, первые- две строки поняты, можно кастинговать так-как у родителя выделена память под объект наследника. Третье тоже понятно- два разных наследника с различной сигнатурой. А что если как-то "обернуть" pug в наследника Hound? Но кроме пересетинга значений из одного наследника к другому у меня не приходит в голову, может знаете другие варианты?
profesor08,
исходя задачи можно понять, что на данный момент вопрос стоит как можно мутировать объект в объект другого типа со схожей сигнатурой без пересечиывния полей.
умничать все могут, а что под собой несет тот же createCat? Переприсвоение?
В таком случае можно юзать лямбды, используя тот же функциональный интерфейс Converter
svladys, выражение dog->createCat() несёт горькую иронию, демонстрирующую, что от осинки не рождает апельсинка. Если очень уж хочется создать плохую иерархию типов, то лучше использовать JS.
svladys, Переприсвоение посмеялся. createCat внутри создает объект Cat в конструктор которого, либо параметрами ты задаешь нужны поля, которые ты берешь из dog.
public Cat createCat() {
return new Cat(this);
// или
// return new Cat(this.name);
// или
// Cat cat = new Cat();
// cat.name = this.name;
}
Процесс называется инициализация, но ты можешь называть переперепереперепереприсвоение, посмеются люди.