Hibernate Query API и Java 1.5 / Обобщения - PullRequest
4 голосов
/ 08 апреля 2009

Все API в Hibernate взяты из версии 1.4 и поэтому не используют обобщенные java.

Поэтому мне интересно, насколько «безопасным» является следующее: (предварительные условия: имя столбца имеет тип данных String или, по крайней мере, совместимо со String)

@SuppressWarnings("unchecked")
public List<String> getAll() {
    Query q = session.createQuery(
        "select name from Customers");
    return q.list();    
}

Из javadoc API Queryi (org.hibernate.Query.list ()).

"Возврат результатов запроса в виде списка. Если запрос содержит несколько строк результатов, строка возвращается в экземпляр Object []."

Ответы [ 3 ]

3 голосов
/ 08 апреля 2009

Обобщения Java используют стирание типов, поэтому во время выполнения нет никакой разницы между List, List<String> и List<Integer>. Все на самом деле просто List с. При компиляции компилятор принудительно применяет тип параметра шаблона, но под прикрытием во время выполнения у вас есть List.

На самом деле, если вы попытаетесь использовать отражение, чтобы найти тип параметра шаблона, вы не сможете.

3 голосов
/ 08 апреля 2009

Это будет безопасно, если вы уверены, что запрос не "содержит несколько результатов в строке". (Я не знаком с запросами, поэтому не уверен, может ли это произойти в этом случае.) Если строка содержит несколько результатов, то при попытке получить к ней доступ она вызовет ClassCastException во время выполнения, поскольку этот элемент будет Объект Object [] вместо объекта String.

2 голосов
/ 08 апреля 2009

В Java дженерики на самом деле являются стиранием, что является не чем иным, как магией компилятора. Типы, используемые в качестве аргументов универсального типа, неизвестны во время выполнения. Поэтому приведение должно быть успешным, если возвращаемый список реализует интерфейс List, но компилятор может выдавать вам предупреждения.

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