Поиск определенного типа, хранящегося в ArrayList <Object>(т. Е. Object = String и т. Д.) - PullRequest
1 голос
/ 16 ноября 2011

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Нет, тип стирания в этом уверен.

0 голосов
/ 16 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...