Size: a a a

2020 August 23

sr

sudo rm -rf / in learn.java
Galv
в хибере энтити не обязательно должен быть классом верхнего уровня, класс и его поля могут быть final, поля могуть быть паблик
Мне кажется, что JPA не может требовать конкретного способа имплементации (создание обьекта через Reflection API, или по-нормальному) и поэтому такие ограничения
источник

A

Adevald in learn.java
Здравствуйте. Пытаюсь разобраться с тем как работают Colletions с Классами, и наследованными классами.
Например у меня есть List<BaseClass>. Могу ли я в него запульнуть всё что наследуется от класса BaseClass. И если не могу, то как мне тогда это реализовать?
источник

A

Anton in learn.java
Adevald
Здравствуйте. Пытаюсь разобраться с тем как работают Colletions с Классами, и наследованными классами.
Например у меня есть List<BaseClass>. Могу ли я в него запульнуть всё что наследуется от класса BaseClass. И если не могу, то как мне тогда это реализовать?
источник

A

Adevald in learn.java
Это происходит без потери каких либо данных?
источник

A

Adevald in learn.java
Подумал что данные могли бы при схоронении в коллекцию усекаться до базового класса. Возможно эт глупость
источник

SS

Stanislau Stasiukevi... in learn.java
Adevald
Это происходит без потери каких либо данных?
будут доступны только методы и поля параметризованного типа, для доступа к данным класса наследника, нужно делать явное приведение типа
источник

A

Adevald in learn.java
Как это делается
источник

SS

Stanislau Stasiukevi... in learn.java
List<BaseClass> list
if (list.get(0) instanceof BaseClassChild)
{
BaseClassChild item = (BaseClassChild) list.get(0)

}
источник

SS

Stanislau Stasiukevi... in learn.java
BaseClassChild наследник BaseClass, и коллекция содержит первый элемент этого типа
источник

A

Adevald in learn.java
Stanislau Stasiukevich
List<BaseClass> list
if (list.get(0) instanceof BaseClassChild)
{
BaseClassChild item = (BaseClassChild) list.get(0)

}
А окромя как через instanceof это не сделать?
Там же Generic имеется, и всякие штуки типо <T extends BaseClass>. Только в процессе разбора данной темы.
источник

A

Anton in learn.java
Adevald
Это происходит без потери каких либо данных?
Не понимаю вопроса.
Коллекция определена как List<E>.
1. В List<Object> можно положить лбой обьект, т.к. любой объект наследуется от Object. Так же с наследниками любого другого обьекта.
2. Проверка там будет только на перекомпиляции. В рантайме List<BaseClass> сотрется до List<Object>.

Когда обьект возвращается из коллекции он все тот же. В коллекции хранится тоько счылка на него, сам обьект лежит в Heap и никуда не перемещается.
источник

SS

Stanislau Stasiukevi... in learn.java
Adevald
А окромя как через instanceof это не сделать?
Там же Generic имеется, и всякие штуки типо <T extends BaseClass>. Только в процессе разбора данной темы.
instanceof лишь доп проверка дабы не получить ClassCastException
источник

LS

L S in learn.java
Adevald
Здравствуйте. Пытаюсь разобраться с тем как работают Colletions с Классами, и наследованными классами.
Например у меня есть List<BaseClass>. Могу ли я в него запульнуть всё что наследуется от класса BaseClass. И если не могу, то как мне тогда это реализовать?
Опять же, говори конкретнее, в саму переменную ты не сможешь положить лист, параметризированный наследником, тк дженерики по дефолту инвариатиативны, в сам лист можешь добавить объект класса наследника
источник

A

Adevald in learn.java
Anton
Не понимаю вопроса.
Коллекция определена как List<E>.
1. В List<Object> можно положить лбой обьект, т.к. любой объект наследуется от Object. Так же с наследниками любого другого обьекта.
2. Проверка там будет только на перекомпиляции. В рантайме List<BaseClass> сотрется до List<Object>.

Когда обьект возвращается из коллекции он все тот же. В коллекции хранится тоько счылка на него, сам обьект лежит в Heap и никуда не перемещается.
Да, на вопрос в общем-то вы ответили мне.
источник

A

Adevald in learn.java
Stanislau Stasiukevich
instanceof лишь доп проверка дабы не получить ClassCastException
Понял. Просто дополнительно для расширения кругозора хотелось узнать можно ли это через ограничение Generic (extends, implements) сделать. Но это не критично в общем-то
источник

SS

Stanislau Stasiukevi... in learn.java
в целом, если вам необхдимо кастить элемент коллекции  к конкретному типу, это уже проблема архитектурного аспекта, лучше работать с базовым типом, а поведение для каждого конкретного завернуть полиморфизмом
источник

A

Adevald in learn.java
Stanislau Stasiukevich
в целом, если вам необхдимо кастить элемент коллекции  к конкретному типу, это уже проблема архитектурного аспекта, лучше работать с базовым типом, а поведение для каждого конкретного завернуть полиморфизмом
Коллекция должна содержать большое количество различных типов, наследованных от одного BaseClass.
Само собой я не силён в архитектуре чтобы грамотно такие задачи разруливать.
источник

SS

Stanislau Stasiukevi... in learn.java
если хотите покопать глубже про работу дженериков, советую глянуть эту статью о стирании типов
https://javarush.ru/groups/posts/2315-stiranie-tipov
источник

A

Adevald in learn.java
Благодарствую!
источник

A

Anton in learn.java
Adevald
Коллекция должна содержать большое количество различных типов, наследованных от одного BaseClass.
Само собой я не силён в архитектуре чтобы грамотно такие задачи разруливать.
Вот несколько практических примеров, как работать с generics
https://annimon.com/article/2637

Для понимания хорошего дизайна могут помочь принципы SOLID и осособенно LSP (Liskov substitution principle).
Если не работаете с элементами коллекции, как с одним типом, возможно не стоит складывать их в коллекцию, а лучше посмотреть паттерны проектирования и пересмотреть дизайн. Без конкретики задачи не понятно что у вас не так.
источник