Что делать с предупреждениями компилятора [duplicate]

Вы можете использовать json_decode () для преобразования строки json в объект / массив PHP.

Например.

Вход:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Выход:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

Несколько точек для запоминания:

  • json_decode требует, чтобы строка была действительной json, иначе она вернется NULL.
  • В случае отказа декодирования json_last_error() можно использовать для определения точного характера ошибки.
  • Сделать убедитесь, что вы перешли в utf8 контент, или json_decode может выйти из строя и просто вернуть значение NULL.

95
задан Paul Bellora 15 April 2013 в 03:19
поделиться

16 ответов

Использование @SuppressWarnings везде, как было предложено, является хорошим способом сделать это, хотя при этом каждый раз вы вызываете q.list(). 'd suggest:

Collections.checkedList()

Замените свое назначение следующим образом:

List<Cat> cats = Collections.checkedList(q.list(), Cat.class);

Вы можете проверить javadoc для этого метода , особенно в отношении equals и hashCode.

Напишите хэндл-бросок

Просто рефакторируйте все ваши @SuppressWarnings в одном месте:

List<Cat> cats = MyHibernateUtils.listAndCast(q);

...

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

Предотвратить появление Eclipse для предупреждений о неизбежных проблемах

В Eclipse перейдите в «Окно»> «Настройки»> «Java»> «Компилятор»> «Ошибки / предупреждения» и в «Тип общего типа» установите флажок Ignore unavoidable generic type problems due to raw APIs

Это отключит ненужные предупреждения для подобных проблем, подобных описанным выше, которые неизбежны.

Некоторые комментарии:

  • Я решил перейти в Query вместо результата q.list(), потому что таким образом этот метод «обмана» может использоваться только для обмана с помощью Hibernate, а не для обмана любого List i n.
  • Вы можете добавить похожие методы для .iterate() и т. д.
94
ответ дан Akshay Singh 21 August 2018 в 22:48
поделиться
  • 1
    На первый взгляд метод Collections.checkedList (Collection & lt; E & gt;, класс & lt; E & gt;) выглядит как идеальное решение. Однако javadoc говорит, что он только предотвращает добавление некорректно введенных элементов через вид вида, который генерирует метод. В данном списке проверка не производится. – phatblat 7 October 2009 в 19:20
  • 2
    & Quot; Список & л; Кошка & GT; list = Collections.checkedList (q.list (), Cat.class); & quot; по-прежнему требует "@ SuppressWarnings" в Eclipse. О другом совете: typing & quot; listAndCast & quot; на самом деле не короче, чем & quot; @ SuppressWarnings & quot; который автоматически добавляется через Eclipse. – Tristan 29 July 2011 в 08:46
  • 3
    BTW, Collections.checkedList() не будет отменять предупреждение о непроверенной задаче. – Diablo 9 September 2016 в 12:55

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

Если вы посмотрите на javax.persistence api docs , вы увидите, что с Java Persistence 2.0 добавлены некоторые новые методы. Один из них - createQuery(String, Class<T>), который возвращает TypedQuery<T>. Вы можете использовать TypedQuery так же, как вы это сделали с Query с той небольшой разницей, что все операции теперь безопасны по типу.

Итак, просто измените свой код на smth следующим образом:

Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();

И вы все настроены.

20
ответ дан antonpp 21 August 2018 в 22:48
поделиться

Попробуйте следующее:

Query q = sess.createQuery("from Cat cat");
List<?> results = q.list();
for (Object obj : results) {
    Cat cat = (Cat) obj;
}
-1
ответ дан Brian Ngure 21 August 2018 в 22:48
поделиться
  • 1
    Это плохая копия ответа Джо Дина , потому что вы все еще должны что-то делать с экземпляром cat. – Artjom B. 15 July 2014 в 23:19

По-видимому, метод Query.list () в Hibernate API не безопасен по типу «по дизайну», и не планирует его изменять .

Я считаю, что самым простым решением избежать предупреждений компилятора действительно является добавление @SuppressWarnings («unchecked»). Эта аннотация может быть помещена на уровне метода или, если внутри метода, прямо перед объявлением переменной.

Если у вас есть метод, который инкапсулирует Query.list () и возвращает List (или Collection), вы также получите предупреждение. Но это подавляется с помощью @SuppressWarnings («rawtypes»).

Метод ListAndCast (Query), предложенный Matt Quail, менее гибок, чем Query.list (). Хотя я могу сделать:

Query q = sess.createQuery("from Cat cat");
ArrayList cats = q.list();

Если я попробую код ниже:

Query q = sess.createQuery("from Cat cat");
ArrayList<Cat> cats = MyHibernateUtils.listAndCast(q);

Я получу ошибку компиляции: Несоответствие типа: невозможно преобразовать из списка к ArrayList

5
ответ дан Community 21 August 2018 в 22:48
поделиться
  • 1
    «нет никаких планов по его изменению». - Это пост с 2005 года. Я был бы удивлен, если с тех пор ситуация не изменилась. – Rup 5 December 2012 в 21:29

Мы также используем @SuppressWarnings("unchecked"), но мы чаще всего пытаемся использовать его только при объявлении переменной, а не в методе в целом:

public List<Cat> findAll() {
    Query q = sess.createQuery("from Cat cat");
    @SuppressWarnings("unchecked")
    List<Cat> cats = q.list();
    return cats;
}
21
ответ дан cretzel 21 August 2018 в 22:48
поделиться

Попробуйте использовать TypedQuery вместо Query. Например, вместо этого: -

Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();

Используйте это: -

TypedQuery<Cat> q1 = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q1.list();
7
ответ дан CubeJockey 21 August 2018 в 22:48
поделиться

Нет, но вы можете выделить его в конкретные методы запроса и подавить предупреждения с помощью аннотации @SuppressWarnings("unchecked").

2
ответ дан Dave L. 21 August 2018 в 22:48
поделиться
  • 1
    Неправильно ... Джо Дин прав, вы можете использовать? как общий тип, чтобы избежать предупреждений ... – Mike Stone 22 September 2008 в 17:40
  • 2
    Это не правда. Если вы используете List & lt;? & Gt; то вы не можете использовать элементы списка как Cat без лишнего шага создания дублированного списка и кастования каждого элемента. – Dave L. 22 September 2008 в 17:52
  • 3
    ну, если вы используете результаты напрямую через кастинг, вам не нужно создавать список, и независимо от того, был ли вопрос «есть ли способ его избежать», ответ определенно ДА (даже без предупреждений о недопустимости) – Mike Stone 22 September 2008 в 18:36

Новые версии Hibernate теперь поддерживают безопасный тип Query<T>, поэтому вам больше не нужно использовать @SuppressWarnings или реализовать какой-либо взломать, чтобы предупреждения компилятора исчезли. В Session API , Session.createQuery теперь вернет объект типа safe Query<T>. Вы можете использовать его следующим образом:

Query<Cat> query = session.createQuery("FROM Cat", Cat.class);
List<Cat> cats = query.list();

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

public Integer count() {
    Query<Integer> query = sessionFactory.getCurrentSession().createQuery("SELECT COUNT(id) FROM Cat", Integer.class);
    return query.getSingleResult();
}

или при частичном выборе:

public List<Object[]> String getName() {
    Query<Object[]> query = sessionFactory.getCurrentSession().createQuery("SELECT id, name FROM Cat", Object[].class);
    return query.list();
}
1
ответ дан David DeMar 21 August 2018 в 22:48
поделиться

Я знаю, что это старше, но 2 пункта, чтобы отметить на сегодняшний день в ответе Matt Quails.

Точка 1

Это

List<Cat> cats = Collections.checkedList(Cat.class, q.list());

Должно быть это

List<Cat> cats = Collections.checkedList(q.list(), Cat.class);

Точка 2

Из этого

List list = q.list();

к этому

List<T> list = q.list();

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

0
ответ дан dldnh 21 August 2018 в 22:48
поделиться
  • 1
    Попробуйте ответить на вопрос, а не ответ на другой ответ. Это нормально, чтобы добавить комментарий к Мэтту Квейлу, чтобы сказать, что он устарел, но просто напишите свой ответ чисто и правильно. – Cory Kendall 26 October 2012 в 07:58

Если вы не хотите использовать @SuppressWarnings («unchecked»), вы можете сделать следующее.

   Query q = sess.createQuery("from Cat cat");
   List<?> results =(List<?>) q.list();
   List<Cat> cats = new ArrayList<Cat>();
   for(Object result:results) {
       Cat cat = (Cat) result;
       cats.add(cat);
    }

FYI - я создал метод утилиты, который делает это для меня, я не могу использовать мой код, и мне не нужно использовать @SupressWarning.

-5
ответ дан Joe Dean 21 August 2018 в 22:48
поделиться
  • 1
    Это просто глупо. Вы добавляете накладные расходы во время выполнения, чтобы преодолеть проблему, связанную с компилятором. Помните, что аргументы типа не подтверждены, поэтому проверка типа выполнения не выполняется. – John Nilsson 17 October 2008 в 23:06
  • 2
    Согласен, если вы все еще хотите сделать что-то подобное, вы можете добавить проверку времени выполнения с помощью: List & lt; Cat & gt; cats = Collections.checkedList (новый ArrayList & lt; Cat & gt; (), Cat.class); cats.addAll (q.list ()); Это должно сработать. – ddcruver 30 November 2010 в 17:52

У нас была такая же проблема. Но это было не очень важно для нас, потому что нам пришлось решать другие более серьезные проблемы с помощью Hibernate Query и Session.

В частности:

  1. контроль, когда транзакция может быть совершено. (мы хотели подсчитать, сколько раз tx был «запущен» и только фиксировать, когда tx «закончился» столько же раз, сколько он был запущен. Полезно для кода, который не знает, нужно ли ему начинать транзакцию.
  2. Сбор показателей производительности.
  3. Откладывание начала транзакции до тех пор, пока не станет известно, что что-то действительно будет сделано .
  4. Более мягкое поведение для query.uniqueResult ()

Итак, для нас мы имеем:

  1. Создаем интерфейс (AmplafiQuery ), который расширяет Query
  2. Создает класс (AmplafiQueryImpl), который расширяет AmplafiQuery и обертывает org.hibernate.Query
  3. Создает Txmanager, который возвращает Tx.
  4. Tx имеет различные методы createQuery и возвращает AmplafiQueryImpl

И, наконец,

AmplafiQuery имеет «asList ()», который является универсальной версией Query.list () У AmplafiQuery есть «unique ()», который является универсальной версией Query.uniqueRe sult () (и просто регистрирует проблему, а не бросает исключение)

Это большая работа, чтобы просто избежать @SuppressWarnings. Однако, как я уже сказал (и перечислены), есть много других лучше! причины для выполнения работ по упаковке.

1
ответ дан Pat 21 August 2018 в 22:48
поделиться

Это не недосмотр или ошибка. Предупреждение отражает реальную основную проблему - нет никакого способа, чтобы java-компилятор действительно мог убедиться, что класс hibernate будет выполнять свою работу должным образом и что список, который он возвращает, будет содержать только Cats. Любое из предложений здесь в порядке.

4
ответ дан paulmurray 21 August 2018 в 22:48
поделиться

Решение Joe Dean выглядит интересным, но вы думаете, что это того стоит - создайте новый List и пропустите все элементы, чтобы избавиться от предупреждений?

(извините, не могу добавить комментарий прямо к его решению по какой-то причине)

0
ответ дан serg 21 August 2018 в 22:48
поделиться
  • 1
    Согласовано. Это кажется ненужным и уродливым, чем просто использование аннотации, чтобы сообщить компилятору, что вы знаете, что существующий список уже содержит правильный тип. – Dave L. 22 September 2008 в 17:55
  • 2
    Альтернативой является использование списка непосредственно с литьем, а не с составлением скопированного списка ... в любом случае, я предпочитаю избегать использования аннотаций, если можно, хотя это субъективный выбор, и вы должны делать то, что вам больше нравится – Mike Stone 22 September 2008 в 18:33
  • 3
    Проблема с предупреждением о недопустимости - вы не получите исключение класса, пока не будете использовать список ... если вы скопируете список, вы получите исключение сразу ... незначительное преимущество, но все же приятно (и если ваши результаты не огромны, то копия не будет чрезмерно неэффективной) – Mike Stone 22 September 2008 в 18:37

В нашем коде мы аннотируем вызывающие методы с помощью:

@SuppressWarnings («unchecked»)

Я знаю, что это похоже на взломать, но недавно был проверен со-разработчик и что это все, что мы могли бы сделать.

5
ответ дан tyshock 21 August 2018 в 22:48
поделиться

Хорошее решение, чтобы избежать предупреждений о безопасности типа с запросом на спящий режим, - использовать инструмент, например TorpedoQuery , чтобы помочь вам построить безопасный тип hql.

Cat cat = from(Cat.class);
org.torpedoquery.jpa.Query<Entity> select = select(cat);
List<Cat> cats = select.list(entityManager);
-1
ответ дан xjodoin 21 August 2018 в 22:48
поделиться
-1
ответ дан Shree 4 November 2018 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: