Prečo nemá @NotNull alebo @Nullable existujú v mojom projekte?

0

Otázka

Ja som programovanie s IntelliJ, a bol som len pracuje na Java projektu, a ja som chcel, aby parameter anotované ako @NotNull. Ale IntelliJ hovorí, že to neexistuje. Skontroloval som všetky java súbory, a to nie je v mojom projekte. Ja som tak zmätený, a nie som cez maven alebo gradle, len predvolené Java projektu. Mám tušenie, čo sa deje.

Tu je príklad:

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);
          }
     }
}

Chyba dodáva, že "Nie je možné vyriešiť symbol NotNul : 10" (opäť @ vpredu)

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

Najlepšiu odpoveď

0

Java sám nie je lode s týmito anotácie.

Namiesto toho, tam sú o 10 navzájom nekompatibilné trvá na myšlienke, z ktorých väčšina pracovať úplne inak a aplikovať rôzne významy toho, čo NonNull znamená, kde si môžete dať to, a ako to funguje.

Oof. To je veľmi nešťastné,, ako základná myšlienka použitia anotácie k pridanie týchto informácií je oveľa lepší ako Nepovinný a ako, vzhľadom na to, že by to byť celkom spätne kompatibilné a nie relegate existujúci kód do doldrums z obsolecence, na rozdiel od Optional.

Tak, nájsť ten, ktorý sa vám páči, a zahrnúť do projektu rovnakým spôsobom môžete patriť žiadnej tretej strane závislosť - zvyčajne vrátane je vo vašom Maven/Gradle/Ant+ivy/etc (vaše stavať súbor je zoznam premenných).

Intellij má svoje vlastné vziať na NonNull a Nullable. Je to asi najvhodnejšia. Jeho myšlienky o tom, čo tieto poznámky znamenať sú nižšie1. Kontrola Rámec je najlepšie, eclipse je vzdialené druhý najlepší, a všetko ostatné (vrátane intellij je) akcie na treťom mieste. najlepšie urobiť, je nájsť v Checker Rámec, alebo, takmer ako dobrý, eclipse to vziať na tieto poznámky. Avšak pochybujem, intellij je null kontrolné systémy sú schopné plne pochopiť jeho viac rozšírené prírastky, ako @PolyNulltak toto dodatočné expresívne by byť väčšinou zbytočne. Ako bonus, intellij lode s partiou údaje o tom, na čo právo neplatnosť anotácie, ktoré by sa o významných knižníc.

Že posledný je dôležité: Najčastejšie sa používa java knižnice, vrátane java.* sám, nemá týchto poznámok, a prácu s pol-null-annotated kód je určite veľmi frustrujúce, cvičenie, náklady na tom, že značne prevyšujú výhody. Jediným skutočným riešením je, "fix' knižnice môžete používať so správnym neplatnosť info, ale toto je veľa práce. Našťastie, intellij urobil veľa to pre vás.

By som očakával (eclipse to), že quickfix (CMD+1 na mac, CTRL+1 na iných počítačoch mac, aspoň z políčko, ak moje pamäti predvolené klávesové skratky slúži mi) obsahuje "automaticky pridať eclipse je neplatnosť anotácie na classpath" (alebo vo vašom prípade, intellij je, samozrejme). V prípade, že je nejako nie sú uvedené, Túto stránku z intellij docs vysvetliť presne ako pridať org.jetbrains.annotations knižnice, ktoré obsahuje ich neplatnosti, anotácie, na váš projekt. V skutočnosti, tieto dokumenty ukazujú, že naozaj, quickfix menu sa ponúkajú vám možnosť automatického pridávania tejto knižnice ako riešenie chyby, máte na svojom @NonNull uzol v zdrojovom kóde.

[1] Väčšina berie na neplatnosť anotácie limit seba značne odlišujú tým, že umožňuje anotácia len na polia, metódy (čo znamená: Čo to vráti), a parametre. Avšak, jeden môže mať rozhodne-nie-null List z by-sa-null Map prípady, ktoré Mapu rozhodne nie je null String aby mohol byť null Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>. Anotácie systém je schopný nechať si napísať, že, ale len v prípade, anotácie sú nastavené len pre TYPE_USE. kontrola rámca a eclipse je neplatnosť anotácie prác, ako že, väčšina iní nie, a preto sú menej výrazné. CheckerFramework ide ešte o krok ďalej a umožňuje vám napísať pojem "buď neplatnosti je v poriadku'. Rovnako ako generiká má 3 formy (List<Integer>a List<? super Integer> a List< extends Integer>raz generiká sú zapojené, 2 nullities (buď nikdy null, alebo určite null je povolené) už nie je dostatočné, že potrebujete viac nullities. kontrola rámec má @PolyNull vám umožňuje prepojenie nullities: môžete napríklad napísať túto metódu v checkerframework ale nemôžete prípadne napíšte ho správne zadali s intellij to, alebo na to príde eclipse je:

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

kde myšlienka je,: Táto metóda vedie matcher proti každý prvok v zozname, a na zápas, tento prvok sa pridá na koniec zoznamu. Táto metóda môže fungovať, ak T je považované za "@NonNull' (vzhľadom na to, že nie nepovoľuje hodnoty null sú v null nikdy nemôže byť pridané do tohto kódexu, takže non-anulovanie jeho prvky nemôže byť narušené), ale funguje rovnako dobre, ak T je @Nullablepodmienkou matcher je aj @Nullable T samozrejme: Teraz tento kód môže pridať null na zozname, ale to je v poriadku.

Tak T nie je ani Nullable ani NonNull, ale Ts uvedené v podpisom musieť zápas až ich nullities. @PolyNull tento problém rieši.

2021-11-22 22:56:48

V iných jazykoch

Táto stránka je v iných jazykoch

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