Поиск определенного типа, хранящегося в ArrayList (то есть Object = String и т. Д.),

Скажем, у меня есть ArrayList, который я применил к объекту ArrayList. Я знаю, что все объекты, которые были в массиве ArrayList, были одного типа, но не того типа.

Теперь, если ArrayList не пуст, я мог бы взять один из объектов в нем и использовать оператор instanceof, чтобы узнать, что такое фактический тип. Но что такое случай, когда ArrayList пуст? Как определить, какой тип объекта на самом деле тогда? Является ли это возможным?

Edit: В ретроспективе, я полагаю, это не имеет особого значения, какой тип имеет пустой ArrayList. Я могу отбросить старый и построить новый пустой ArrayList нужного типа, который я искал в первую очередь.

Это немного беспорядочно, поэтому, если у кого-то есть альтернативные предложения о том, как разрешить большое разнообразие потенциальных типов, которые могут не иметь общего общего суперclassа (Ex. Integer и ArrayList), я открыт для предложений. Дело в том, что у меня есть class, который будет содержать другие classы, специально предназначенные для взаимозаменяемости в нем. Скрытые classы могут делать предположения относительно типа, поскольку они определяют его. Окружающий class не может делать такие предположения, но должен подтвердить, что он указывает тот же тип, что и содержащиеся в нем classы.

Таким образом, мой вопрос, поскольку содержащийся class является общим (общий тип, определяющий тип типа, который он обрабатывает), но он должен гарантировать, что содержащиеся в нем classы, которые он передал, возвращаются и работают по типу, который ему был указан (они предназначены для создаются отдельно и как таковой факт, что они совпадают, должны быть подтверждены, когда они прорезаны, а не во время их создания).

Нет, тип erasure гарантирует это.

Как отметил Джеффри, это невозможно из-за магии стирания типа. Ваш лучший выбор, я думаю, это добавить дополнительный случай для пустого списка:

if (list.isEmpty()) { // process empty ... } else { Object o = list.get(0); if (o instanceof Integer) { List integers = (List) list; // process Integer ... } else if (o instanceof String) { List strings = (List) list; // process String ... } // etc... } 

Но будьте осторожны! Этот instanceof цепи обычно не считается хорошей практикой OO. Вместо того, чтобы проходить вокруг голых списков, а затем пытаться угадать их составляющие, рассмотрим создание classа-оболочки для списков, которые также могут содержать ссылку на объект Class . Таким образом, вы также сможете реорганизовать свои различные алгоритмы обработки как переопределение одного метода process()