Есть ли способ перебирать ... и также вызывать методы класса объектов?
Да, конечно, есть.
Какой бы объект не былхранится в структуре данных, вы можете вызвать его методы.Проблема, с которой вы сталкиваетесь, имеет два аспекта:
Во-первых, ваши list1
, list2
, list3
, ... объявлены как ArrayList<Object>
.Это означает, что, что бы вы ни указали в списках, при извлечении компилятор будет знать только, что это какой-то Object
.Следовательно, он позволяет только вызывать методы из Object
для этих элементов.Это можно обойти путем явного приведения, например,
MyClass element = (MyClass)(layers.get(i).get(j));
element.calculate();
Однако, лучшей альтернативой является использование правильного универсального типа в первую очередь.Обратите внимание, что ArrayList<ArrayList>
использует «необработанный» тип ArrayList
в качестве параметра универсального типа, что, вероятно, не то, что вам нужно.
Итак, предполагая, что все элементы, которые вы храните, относятся к одному и тому же типу (MyClass
например), чистое решение будет выглядеть следующим образом:
ArrayList<MyClass> list1 = ...;
ArrayList<ArrayList<MyClass>> bigList = ...;
Теперь компилятор будет знать, что внутри bigList
есть ArrayList<MyClass>
объекты, и из этого он также знает, что внутри элементовиз bigList
есть MyClass
объектов.Следовательно, он автоматически сделает необходимые преобразования, и вы можете написать bigList.get(i).get(j).methodOfMyClass(...)
.
Если элементы, которые вы храните во внутренних списках, не имеют общего (супер) типа, то есть их единственный общий супертипнеявно это Object
, тогда у вас не будет выбора, кроме как делать соответствующие instanceof
проверки и приведения вручную.
Кстати, поскольку ArrayList
(косвенно) реализует интерфейс Iterable
, выможно просто написать
for ( ArrayList<MyClass> innerList : bigList ) {
for ( MyClass element : innerList ) {
element.methodOfMyClass(...);
}
}
для перебора всех элементов всех списков, содержащихся в bigList
.