powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как опредить тип элемента коллекции, если у них общий superclass
30 сообщений из 30, показаны все 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
Как опредить тип элемента коллекции, если у них общий superclass
    #37629124
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИсходная постановка задачи: нарисовать карту нас. пункта, причем нас. пункт не фиксирован, а имеет произвольную структуру. Я решил использовать паттерн Компоновщик. В последний момент попросили заимплементить функцию, которая отображает, сколько в агрегате всего деревьев (кроме них еще есть дома и пустыри)... в связи с этим возник топик

В принципе в вашем случае можно обойтись и instanceof, но когда он появляется хотя бы один раз, то провоцирует в дальнейшем на добавление еще одной ветки и т.п., не clean ООП. В вашем случае, предвидя, что вас скорее всего потом попросят добавить а сколько пустырей и сколько домов, то я бы сделал так.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class CompositeUtils{

public Collection<ISomeInterface> getAllInstancesOf(Class type, ISomeInterface composite){
     List<ISomeInterface> instances = ...
     for each instance for composite {
            if(instance.getClass().equals(type)){
                 instances.add(instance);
           }
     }
      return instances;
  }


public int getCountInstancesOf(Class type, ISomeInterface composite){
      return getAllInstancesOf(type, composite).size();
}

}
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629126
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, я бы в самом композите это и разместил
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629588
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосМне нужно, чтобы эта коллекция могла иметь представление в виде "составной объект – его части", и был реализован одинаковое обращение к этим элементам коллекции... но вот, получилось, что коллекцию надо перебрать "через один" в очень редком случае. Даже не знаю, как лучше поступить

Перебрать через один и сделать с элементами что?

Код: java
1.
2.
3.
4.
5.
for (ISomeInterface isi : list) {
  if (isi instanceof ClassA) {
    // Что тут нужно сделать особенного, нельзя ли это добавить в интерфейс для всех классов?
  } else if (...)
}


Если нужно пропустить элемент коллекции, тогда в интерфейс можно добавить метод,
который у большинства классов не будет ничего делать, а только у нужного класса будет.

Либо же из этих исключительных классов можно сделать отдельный список, и передавать его уже в другой метод.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629655
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID,

У него составные объекты. Парент Чилд Парент Чилд :-)
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629689
pasha701
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если много операций подобного типа , и есть неприязнь к "instanceof", Visitor предпочтительее.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
import org.junit.Test;

public class VisitorTest {
    abstract class Parent {
        public abstract void accept(Visitor visitor);
    }

    class Tree extends Parent {
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }

    class Home extends Parent {
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }

    interface Visitor {
        void visit(Home value);
        void visit(Tree value);
    }

    class CountVisitor implements Visitor {
        int homeCount;
        int treeCount;

        @Override
        public void visit(Home value) {
            homeCount++;
        }

        @Override
        public void visit(Tree value) {
            treeCount++;
        }

        public int getHomeCount() {
            return homeCount;
        }

        public int getTreeCount() {
            return treeCount;
        }

    }

    @Test
    public void testVisitor() {
        CountVisitor visitor = new CountVisitor();
        Parent[] values = {new Tree(), new Home(), new Tree()};
        for (Parent value : values) {
            value.accept(visitor);
        }
        System.out.println("homes: " + visitor.getHomeCount() + ", trees: "
                        + visitor.getTreeCount());
    }

}


...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как опредить тип элемента коллекции, если у них общий superclass
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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