как указать родовой тип во время выполнения - PullRequest
1 голос
/ 12 мая 2010

У меня есть arraylist, мне нужно указать тип во время выполнения.

ArrayList<String> alist = new ArrayList<String>();

Мне нужно указать тип "String" во время выполнения. Как мне это сделать. Оно не должно быть статичным.

Ответы [ 3 ]

5 голосов
/ 12 мая 2010

Это невозможно из-за стирания типа - процесс, в котором компилятор удаляет всю информацию, относящуюся к параметрам типа и аргументам типа внутри класса или метода.

Доступно только во время компиляции для проверки типов.

РЕДАКТИРОВАТЬ: В качестве обходного пути к вашей проблеме вы можете использовать ArrayList<Object>, что позволит вам добавлять любые типы в ArrayList. В этом случае вы можете проверить типы, используя instanceof и приведение к конкретным типам.

1 голос
/ 12 мая 2010

Параметр универсального типа не скомпилирован в байт-код, поэтому он недоступен во время выполнения. ArrayList - это просто ArrayList во время выполнения. Самое близкое, чего вы можете достичь, это добавить проверки во время выполнения самостоятельно. Например, класс Collections предоставляет декоратор , который делает именно это:

List l = Collections.checkedList(new ArrayList<String>(), String.class);
l.add("Jave uses erasure");
l.add(14);

Если список был создан просто как ArrayList , оба дополнения будут выполнены во время выполнения. Однако при реализации оболочки все дополнения элементов проверяются, поэтому второй вызов вызовет исключение ClassCastException.

1 голос
/ 12 мая 2010

Вы имеете в виду, что вы хотите параметризовать тип, используемый для создания ArrayList?

public <T> List<T> interestingMethod(Class<T> type) {
    List<T> aList = new ArrayList<T>();
    // do something interesting...
    return aList;
}

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

Как и все остальные отметят, у нас нет информации о типах времени выполнения с обобщениями из-за стирания типов.

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