подходящие дженерики для использования в arraylist - PullRequest
1 голос
/ 25 февраля 2011

Я использую Arraylist для хранения разнородных данных ... микс объектов String, int и class (Эти объекты могут быть экземплярами любого класса, который я определил.). Я инициализировал ArrayList как ArrayList<Object> = new ArrayList<Object>.

Но я думаю, что я слышал, как люди говорили, что прямая ссылка на Объекты - это что-то. плохой / нежелательно? Я имею в виду объекты, потому что я не могу найти подходящих обобщений для использования в моем случае. Это нормально для использования или есть какие-либо подходящие дженерики? (Я относительно новичок в Java)

Ответы [ 3 ]

2 голосов
/ 25 февраля 2011

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

 Map<Class<?>,List<?>> map = new HashMap<Class<?>,List<?>>();
 map.put(String.class, new ArrayList<String>());
 map.put(Integer.class, new ArrayList<Integer>());
 map.put(Class.class, new ArrayList<Class<?>>());

РЕДАКТИРОВАТЬ:

PS: вы все равно получите непроверенное предупреждение при получении списка с карты, если вы хотите добавить новый объект в список.

public static void main(String[] args) {
        Map<Class<?>,List<?>> map = new HashMap<Class<?>,List<?>>();
        map.put(String.class, new ArrayList<String>());
        map.put(Integer.class, new ArrayList<Integer>());
        map.put(Class.class, new ArrayList<Class<?>>());

        String str = "deneme";

        @SuppressWarnings("unchecked")
        List<String> strList =  (List<String>) map.get(String.class);
        strList.add(str);
        strList.add("str2");
        strList.add("str2");

        @SuppressWarnings("unchecked")
        List<Class<?>> classList =  (List<Class<?>>) map.get(Class.class);
        classList.add(String.class);
        classList.add(Integer.class);
        classList.add(Double.class);


        for(String currentStr:strList){
            System.out.println(currentStr);
        }
    }
1 голос
/ 25 февраля 2011

Всякий раз, когда вы помещаете Object в качестве универсального классификатора, вы в конечном итоге получаете множество уродливых утверждений, таких как

if (elem instanceOf String)
else if (elem instanceOf Integer)

и так далее. Часто для каждого лучше использовать отдельный список, например,

List<String> strings = new LinkedList<String>();
List<Integer> ints = new LinkedList<Integer>();

Поэтому я бы посоветовал вам переделать вашу программу, чтобы лучше использовать возможности Java.

0 голосов
/ 25 февраля 2011

Вам действительно не нужно использовать дженерики, если вы заранее не знаете тип целевых объектов.

Компилятор может дать предупреждение, но что добрые люди могут сделать в таком зле!

Примечание : Вы можете использовать неограниченные символы и символы подстановки для игнорирования предупреждения, но я не уверен, поможет ли оно в противном случае.

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