powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как опредить тип элемента коллекции, если у них общий superclass
25 сообщений из 30, страница 1 из 2
Как опредить тип элемента коллекции, если у них общий superclass
    #37628421
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть коллекция "разношерстных" элементов. Коллекция объявлена как ArrayList<ISomeInterface>. В коллекцию помещаются потомки класса SomeClacc, который реализует интерфейс ISomeInterface. Каждый потомок имеет данные, которые отличаю его от других потомков... Как можно определить на элемент какого типа ссылается переменная-счетчик при переборе исходной коллекции...

В принципе, мне пришло в голову решение присваивать каждому классу static - тег. И реализовать метод getTag(). Но решил поинтересоваться: а нет ли более красивого решения?
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628429
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жентос,

getClass(), instanceof ???
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628438
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S7Жентос,
getClass(), instanceof ???
Как вариант. Я просто новичок в Java, потому могу всякие элементарные вещи спрашивать.

А вот потом можно привести этот элемент явно к нужному мне классу? Или это плохой подход?
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628449
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жентос,

рискуете норваться на ClassCastException )
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628458
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинЖентос,
рискуете норваться на ClassCastException )

Ну вот... а как можно решить эту проблему и не нарваться на исключение?
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628460
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жентос,

cast
или просто
Код: java
1.
2.
3.
4.
public void method(Object o) {
    Integer i = (Integer)o; // ClassCastException may occur
...
}


+ поиск в гугле по "Java type casting"
cast довольно распространён. Но нужно с ним повнимательней. Откладывание проверки типов в рантайм - это дополнительный риск.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628558
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жентос
Если у вас возникла мысль отличать классы, реализующие один интерфейс,
значит интерфейс нужно разбить на несколько интерфейсов, и классы сложить в несколько коллекций,
а не заниматься преобразованием типов в рантайме.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628671
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTIDЖентос
Если у вас возникла мысль отличать классы, реализующие один интерфейс,
значит интерфейс нужно разбить на несколько интерфейсов, и классы сложить в несколько коллекций,
а не заниматься преобразованием типов в рантайме.
Мне нужно, чтобы эта коллекция могла иметь представление в виде "составной объект – его части", и был реализован одинаковое обращение к этим элементам коллекции... но вот, получилось, что коллекцию надо перебрать "через один" в очень редком случае. Даже не знаю, как лучше поступить
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628691
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно например, почитать про паттерн Composite
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628696
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никМожно например, почитать про паттерн Composite
Это он и есть
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628700
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
interface ISomeInterface {}
class SomeClass implements ISomeInterface {}
class ClassA extends SomeClass {}
class ClassB extends SomeClass {}
class ClassC extends SomeClass {}

// ...

ArrayList<ISomeInterface> list = ...;

for (ISomeInterface isi : list) {
  if (isi instanceof ClassA) {
    ClassA ca = (ClassA) isi; // не будет тут "рискуете норваться на ClassCastException"
    System.out.println(ca.getClass());
  } else if (...)
}
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628811
pasha701
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Visitor pattern
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628923
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasoff.net,
+1
странно, что в java боятся приведения типов и проверки типов в рантайм.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628932
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123+1
странно, что в java боятся приведения типов и проверки типов в рантайм.
В подавляющем большинстве случаев это нарушение полиморфизма и недостаток дизайна. Лишь в некоторых случая использование instanceof оправдано простостой реализации.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628946
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123+1
странно, что в java боятся приведения типов и проверки типов в рантайм.
В подавляющем большинстве случаев это нарушение полиморфизма и недостаток дизайна. Лишь в некоторых случая использование instanceof оправдано простостой реализации.
непонял, что именно нарушение.
В Delphi часто делал:
- без интерфейсов (полиморфизм) - в массиве классы наследники над базовым. Если достать базовый класс, то вызван будет метод наследника.
- с интерфейсами (реже) - проверять на наличие интерфейса.
1 способ мне больше по душе.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628960
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Petro123!

> непонял, что именно нарушение.

Просто в 90% случаев удаление instanceof приводит к упрощению кода.И
делает его много проще. Но надо подумать.

> В Delphi часто делал:

В delphi та ж фигня.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628962
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,
я бы и интерфейсы удалил в 99%. Чтобы не пихать куда не надо. :)
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37628983
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интерфейсы они на то и интерфейсы чтобы определять абстракцию. А instanceof обходится введением нужной логики в нужные подклассы, на то это и есть полиморфизм. Как правильно сказали, зачастую это признак плохого дизайна, но в некоторых случаях может быть сделано допущение для упрощения.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629005
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. при игрушке-рисовалке удобно так:

[quote Жентос]Есть коллекция "разношерстных" элементов. Коллекция объявлена как ArrayList<БазовыйКласс>. В коллекцию помещаются потомки класса БазовыйКласс
которые перегружают метод Paint(Canvas)
- при вызове метода Paint окна, можно одной строкой отрисовать всю коллекцию
проходя по коллекции вызвав базовый метод Paint()
[/quote]
(полиморфизм в рантайме без интерфейса)
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629015
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовал метод товарища grasoff.net
Исходная постановка задачи: нарисовать карту нас. пункта, причем нас. пункт не фиксирован, а имеет произвольную структуру. Я решил использовать паттерн Компоновщик. В последний момент попросили заимплементить функцию, которая отображает, сколько в агрегате всего деревьев (кроме них еще есть дома и пустыри)... в связи с этим возник топик
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629026
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жентос,
да. Как всегда, задачу можно решить 99 разными способами. Удачи!
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629032
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один я жду в топике леонида и свенома? с последующим холиваром на тему, сколько способов существует для решения этой задачи?
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629033
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- без интерфейсов (полиморфизм) - в массиве классы наследники над базовым. Если достать базовый класс, то вызван будет метод наследника.

Ну, это о чем я и говорю.

Petro123- с интерфейсами (реже) - проверять на наличие интерфейса.

Если интерфейс маркерный, то следовало бы использовать аннотации. Если интерфейс с методами, то встаёт логичный вопрос, а почему у нас такой список гетерогенный получился.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629048
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraПросто в 90% случаев удаление instanceof приводит к упрощению кода.

Почему не 91%?

GKS_SamaraИ делает его много проще. Но надо подумать.

instanceof, действительно часто бывает проще в случае если это
- единственная проверка в единственном месте кода, а не разбросаная по разным классам.
- если special case - один единственный. Если там будет уже хотя бы 2 if (... instanceof...) подряд, то код только усложняется.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629049
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
ok теперь понял :). согласен.
Озверин, она слишком мелкая
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как опредить тип элемента коллекции, если у них общий superclass
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]