2012-01-26 4 views
5
final Criteria crit = session.createCriteria(MyClass.class); 
final List<MyClass> myClassList = crit.list(); 

результаты в этом: Тип безопасность: выражение списка типа необходимо непроверенное преобразование, чтобы соответствовать списокИзбегайте предупреждающие типа с Hibernate критерии запросом

их метод, чтобы удалить предупреждение, а Я получаю сообщение об ошибке с помощью этого:

final List<MyClass> myClassList = Collections.checkedList(MyClass.class, crit.list()); 

ответ

6

Ну, вы можете использовать:

@SuppressWarnings("unchecked") 

до объявления ...

Обратите внимание, что это будет только подавлять предупреждение - это не сделает ничего, чтобы сделать код более безопасным. В этом случае я лично был бы достаточно доволен об этом; Я бы доверял Hibernate, чтобы поступать правильно.

+0

@EvertonAgner: Я прошел мимо вопроса «удалить предупреждение». –

+0

Да, да, я знаю ... Я имел в виду, что мы должны знать, хочет ли он решить проблему, или если у него просто есть ОКР об предупреждениях ........ Как я делаю * lol – everton

+2

Если вы зависите от Сторонний API, который возвращает нетипизированные коллекции, вы не можете с пользой сделать что-то, кроме подавления предупреждения. И добавьте комментарий, объясняющий, почему вы можете гарантировать, что элементы коллекции действительно имеют нужный тип. –

4

В коде

final List<MyClass> myClassList 
    = Collections.checkedList(MyClass.class, crit.list()); 

вам просто нужно, чтобы инвертировать порядок аргументов checkedList().

Btw вы можете статически импортировать метод, чтобы сделать код более кратким. Также, кстати, я не знал о checkedList() - спасибо за хедз-ап!

Редактировать: checkedList() не делает то, что вы хотите - как я должен был убедиться, правильно ли я думал об этом, прежде чем отвечать.

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

Ответ Джона Скита (@SuppressWarnings("unchecked")) является правильным.

+0

Я все еще получаю предупреждение ... после изменения параметров – NimChimpsky

+0

Извините - не смотрел на это достаточно внимательно. Перейдем к редактированию ответа с лучшей информацией. –

1

Для меня, лучший способ избежать предупреждения безопасности типа как Matt Quail говорит в этом посте: How to avoid type safety warnings with Hibernate HQL results?, написание литую-помощника, но с критериями вместо запроса, как это:

@SuppressWarnings("unchecked") 
public static <T> List<T> listAndCast(Criteria crit) { 
    List<T> list = crit.list(); 
    return list; 
} 

И только вы должны позвонить по этому методу:

List<MyClass> myClassList = listAndCast(crit); 

Приветствия!