Вы можете сделать это с любой существующей структурой данных, я бы рекомендовал List
или Set
. Например:
Collection<Super> supers = new ArrayList<Super>();
Теперь, когда вы говорите это:
Я предполагаю, что смогу отбросить каждый слот списка в любой из подклассов,
Это неверное предположение. Коллекция будет содержать любой объект, который расширяет Super
, однако вы не можете произвольно преобразовать каждый элемент во что угодно. Вам нужно будет выполнить тест instanceof
для каждого элемента, если вы ищете функциональность такого типа, пример ниже:
for(Super currentSuper : supers)
{
if(currentSuper instanceof SubA)
{
SubA subA = (Suba) currentSuper);
// do stuff with subA
}
else if(currentSuper instanceof SubB)
{
SubB subB = (SubB) currentSuper);
// do stuff with subB
}
}
Объем по мере необходимости.
Теперь по поводу Влада:
и гораздо лучшим дизайном было бы не проверять, что такое фактический класс, а просто вызывать виртуальный метод, который в любом случае будет делать правильные вещи.
Если вы можете гарантировать функциональность всех потенциальных подклассов и не имеете проблем с людьми, переопределяющими ваши классы (если вы не отметили их как окончательные), вам не нужно выполнять экземпляр test. Вместо этого ваш код может быть таким же простым, как:
for(Super currentSuper : supers)
{
currentSuper.doSomethingNifty();
}
person
Woot4Moo
schedule
04.11.2012
Collection
, а неList
- person Woot4Moo   schedule 05.11.2012