Почему в моем проекте не существует @NotNull или @Nullable?

0

Вопрос

Я программирую с помощью IntelliJ, и я просто работал над проектом Java, и я хотел сделать параметр аннотированным как @NotNull. Но IntelliJ говорит, что его не существует. Я проверил все файлы java, и их нет в моем проекте. Я так запутался, и я не использую maven или gradle, просто проект Java по умолчанию. Я понятия не имею, что происходит.

Вот пример:

package com.company;


    public class Main {
         public static void main(String[] args){
                testF(null);
         }
         public static void testF (@NotNull Integer... numbers){
            for(Integer integer: numbers){
                   System.out.println(integer);
          }
     }
}

Появляется ошибка со словами "Не удается разрешить символ NotNul : 10" (снова @ впереди)

annotations intellij-idea java
2021-11-22 22:38:50
1

Лучший ответ

0

Сама Java не поставляется с этими аннотациями.

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

Богатство. Это очень прискорбно, поскольку основная идея использования аннотаций для добавления этой информации значительно превосходит необязательную и тому подобное, учитывая, что она будет полностью обратно совместима и не приведет существующий код к депрессии устаревания, в отличие от Optional.

Итак, найдите тот, который вам нравится, и включите его в свой проект так же, как вы включаете любую стороннюю зависимость - обычно путем включения его в свой Maven/Gradle/Ant+ivy/etc (список зависимостей вашего файла сборки).

У Intellij есть свой собственный взгляд на ненулевое и обнуляемое. Это, наверное, самое удобное. Его представления о том, что означают эти аннотации, ниже 1. Фреймворк Checker является лучшим, eclipse занимает второе место, а все остальное (включая intellij) занимает третье место. лучшее решение можно найти в рамках проверки или, почти так же хорошо, в eclipse, в этих аннотациях. Однако я сомневаюсь, что системы проверки нулей intellij способны полностью понять его более продвинутые дополнения, такие как @PolyNull, так что эта дополнительная выразительная сила будет в основном потрачена впустую. В качестве бонуса intellij предоставляет кучу данных о том, какими должны быть правильные аннотации о недействительности в основных библиотеках.

Последнее важно: наиболее часто используемые библиотеки java, в том числе java.* сам по себе, не имеет этих аннотаций, и работа с кодом с наполовину нулевыми аннотациями, безусловно, является весьма неприятным занятием; затраты на это значительно перевешивают преимущества. Единственное реальное решение - "исправить" библиотеки, которые вы используете, с правильной информацией о недействительности, но это огромная работа. К счастью, intellij многое сделал для вас.

Я ожидал бы (eclipse делает это), что быстрое исправление (CMD+1 на компьютерах mac, CTRL+1 на компьютерах, не являющихся компьютерами Mac, по крайней мере, из коробки, если мне помогает память о сочетаниях клавиш по умолчанию) включает "автоматическое добавление аннотаций о недействительности eclipse в путь к классу" (или, в вашем случае, intellij, конечно). Если это почему-то не отображается, эта страница из документов intellij точно объясняет, как добавить org.jetbrains.annotations библиотека, содержащая их аннотации о недействительности, для вашего проекта. На самом деле, эти документы указывают на то, что меню quickfix действительно предлагает вам возможность автоматического добавления этой библиотеки в качестве решения ошибки, которую вы получаете на своем @NonNull узел в вашем исходном коде.

[1] Большинство аннотаций с нулевым значением значительно ограничивают себя, позволяя аннотацию только для полей, методов (подразумевая: что она возвращает) и параметров. Тем не менее, можно иметь определенно не нулевое значение List из может быть-нулевым Map экземпляры, которые определенно не являются нулевыми String to может быть нулевым Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>. Система аннотаций способна позволить вам написать это, но только в том случае, если ваши аннотации настроены исключительно для TYPE_USE. Аннотации фреймворка checker и eclipse nullity работают подобным образом; большинство других не работают и поэтому менее выразительны. CheckerFramework делает еще один шаг вперед и позволяет вам написать понятие "либо недействительность-это нормально". Так же, как дженерики имеют 3 формы (List<Integer>, и List<? super Integer> и List< extends Integer>, как только задействованы универсальные, 2 значения null (либо никогда не равно нулю, либо определенно разрешено значение null) уже недостаточно, вам нужно больше значений null. структура проверки имеет @PolyNull воля позволяет вам связывать пустоты: вы можете, например, написать этот метод в checkerframework, но вы не можете написать его правильно с помощью intellij или, если на то пошло, eclipse:

public void duplicateFirstMatch(List<T> elems, Predicate<T> matcher);

где идея: Этот метод запускает сопоставитель для каждого элемента в списке, и при совпадении этот элемент добавляется в конец списка. Этот метод может сработать, если T считается "@NonNull " (учитывая, что в коде нет нулей, null никогда не может быть добавлен этим кодом, поэтому он не может нарушать ненулевое значение его элементов), но он работает так же хорошо, если T является @Nullable, при условии, что сопоставитель также имеет @Nullable T конечно: теперь этот код может добавить null в список, но это нормально.

Таким образом T не является ни недействительным, ни ненулевым, но Ts, упомянутые в подписи, должны соответствовать их недействительности. @PolyNull решает эту проблему.

2021-11-22 22:56:48

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории