Использование объекта для создания экземпляра коллекции - PullRequest
2 голосов
/ 01 июня 2011

Я хотел бы сделать следующее (что не работает, это просто для объяснения концепции). Есть идеи как это сделать?

Class type;
if (/* something */)
  type = String.class;
else
  type = Boolean.class;

return new ArrayList<type>();

ArrayList<type> не работает. Я пробовал с type.getClass(), тоже не работает.

Ответы [ 6 ]

5 голосов
/ 01 июня 2011

Оберните его в метод, передайте тип как generic Class и позвольте Java сделать все остальное за вас.Нет необходимости в каких-либо условных переходах.

<T> List<T> newList(Class<T> type) {
    return new ArrayList<T>();
}

Тогда вы можете использовать его следующим образом:

List<String> list = newList(String.class);

Имейте в виду, что T не обязательно указывать в Общий класс уровень.Вы можете указать универсальный тип для метода и, следовательно, сделать его универсальным методом , как в примере кода.

3 голосов
/ 01 июня 2011

Вы не можете этого сделать. Ваша проверка происходит во время выполнения, и генерики теряются после компиляции.

Единственная цель обобщений - гарантировать безопасность типов во время компиляции. В вашем примере вы хотите определить тип во время выполнения.

То, что вы можете сделать, это создать экземпляр коллекции разного типа в каждом if.

2 голосов
/ 01 июня 2011

вы должны использовать:

public ArrayList<?> getList() {
    if (/* something */) {
        return new ArrayList<String>();
    } else {
        return new ArrayList<Boolean>();
    }
}
1 голос
/ 01 июня 2011

Информация о типе удаляется компилятором Java, но может быть доступна через дополнительные пакеты, такие как this

0 голосов
/ 01 июня 2011

Условие if, по-видимому, определяется во время выполнения.Параметризованные типы в Java очищаются во время компиляции.Простой возврат нового ArrayList () будет иметь тот же эффект.

0 голосов
/ 01 июня 2011

type не class, в этом случае вы можете получить многократный возврат Вы можете иметь это

public <T> List<T> foo(T type) {
    return new ArrayList<T>();
}
...