Proč ne @NotNull @možnou hodnotou null existují v mém projektu?

0

Otázka

Jsem programování s IntelliJ, a jen jsem pracoval na Java projekt, a chtěl jsem, aby parametr komentovaný jako @NotNull. Ale IntelliJ říká, že to neexistuje. Zkontroloval jsem všechny java soubory, a to není v mém projektu. Jsem tak zmatená, a nejsem pomocí maven nebo gradle, jen výchozí Java projektu. Nemám tušení, co se děje.

Zde je pří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 přijde, že "Nelze vyřešit symbol NotNul : 10" (opět @ vpředu)

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

Nejlepší odpověď

0

Java sama o sobě není loď s těmito popisy.

Místo toho, tam jsou asi 10 vzájemně neslučitelné trvá na myšlence, z nichž většina pracují zcela odlišně a aplikovat různé významy toho, co NonNull to znamená, kde si můžete dát to, a jak to funguje.

Uf. To je velmi nešťastné, jako základní myšlenka použití poznámky k přidat tyto informace je mnohem lepší, aby Nepovinné a tak, vzhledem k tomu, že to by bylo zcela zpětně kompatibilní a nebude degradovat stávající kód do deprese z obsolecence, na rozdíl od Optional.

Takže, najít ten se vám líbí, a zahrnout ji do projektu stejným způsobem obsahovat žádné třetí strany závislostí - obvykle tím, včetně v Maven/Gradle/Ant+ivy/etc (soubor s příponou build, je seznam závislostí).

Intellij má svůj vlastní pohled na NonNull a s možnou hodnotou null. To je pravděpodobně nejvíce pohodlné. Jeho představy o tom, co tyto popisy, tím jsou nižší než1. Kontrola Rámec je nejlepší, eclipse je vzdálené druhý nejlepší, a všechno ostatní (včetně intellij) dělí o třetí místo. nejlepší si je lze nalézt v Kontrola Rámce, nebo skoro tak dobré, eclipse se na tyto popisy. Nicméně pochybuji, intellij je null kontrola systémy jsou schopny plně pochopit jeho pokročilejší doplňky, jako jsou @PolyNull,, takže toto dodatečné expresivní síly by být většinou zbytečně. Jako bonus, intellij lodě s spoustu dat o tom, co právo neplatnost popisy by být na velkých knihoven.

To poslední je důležité: Nejčastěji používané java knihoven, včetně java.* sám, nemá tyto popisy, a práce s půl-null-komentovaný kód je rozhodně velmi frustrující cvičení; náklady tom, že výrazně převažují nad výhodami. Jediným skutečným řešením je, aby "opravit" knihoven použití s správné neplatnost info, ale je to spoustu práce. Naštěstí, intellij udělal hodně pro vás.

Já bych očekávat, že (zatmění to dělá), že quickfix (CMD+1 na mac, CTRL+1 na non-mac, alespoň z krabice, pokud moje paměť výchozí klávesové zkratky slouží mi) obsahuje 'automaticky přidat eclipse je neplatnost popisy na classpath (nebo ve vašem případě, intellij je, samozřejmě). Pokud je to nějak nezobrazuje, Tato stránka od intellij docs přesně vysvětlit, jak přidat org.jetbrains.annotations knihovna, která obsahuje jejich neplatnost popisy, aby váš projekt. Ve skutečnosti, tyto dokumenty naznačují, že skutečně quickfix menu vám nabízí možnost automaticky přidat tuto knihovnu jako řešení na chyba, kterou dostanete na váš @NonNull uzlu ve zdrojovém kódu.

[1] Většina trvá na neplatnosti popisy se omezují podstatně tím, že umožňuje anotace, pouze na pole, metody (což znamená: to, Co se vrátí), a parametry. Nicméně, jeden může mít určitě-ne-null List mohl-být-null Map případy, které Mapa rozhodně není null String aby mohl být null Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>. Anotace systém je schopen nechat vás psát, ale pouze tehdy, pokud vaše popisy jsou nastaveny pouze pro TYPE_USE. kontrola rámce a zatmění je neplatnost popisy práce, ostatní nemají, a proto jsou méně výrazné. CheckerFramework jde o krok dále a umožňuje psát pojem 'buď neplatnost je v pořádku'. Stejně jako generika má 3 formy (List<Integer>a List<? super Integer> a List< extends Integer>jakmile generika jsou zapojeny, 2 nullities (buď nikdy null, nebo rozhodně null je povoleno), není již dostačující, budete potřebovat více nullities. kontrola rámce @PolyNull bude vám odkaz nullities: můžete například napsat tuto metodu v checkerframework ale nemůžeš to napsat správně zadali s intellij, nebo na to přijde zatmění:

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

kde myšlenka je: Tato metoda vede matcher proti každý prvek v seznamu, a na zápas, který prvek je přidán na konec seznamu. Tato metoda může fungovat, pokud T je považován za '@NonNull' (vzhledem k tomu, že žádné hodnoty null, null nikdy být přidány tím, že tento kód, takže non-neplatnost jeho prvky nemohou být porušeny), ale funguje stejně dobře, pokud T je @Nullableza předpokladu , že matcher je také @Nullable T samozřejmě: Teď tento kód může přidat hodnotu null do seznamu, ale to je v pořádku.

Tak T není s možnou hodnotou null ani NonNull, ale Ts uvedeno v podpisu třeba, aby odpovídaly jejich nullities. @PolyNull tento problém řeší.

2021-11-22 22:56:48

V jiných jazycích

Tato stránka je v jiných jazycích

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