Perché non @NotNull o @Nullable esiste nel mio progetto?

0

Domanda

Io sono di programmazione con IntelliJ, e stavo lavorando su un progetto Java, e ho voluto fare un parametro annotato come @NotNull. Ma IntelliJ dice che non esiste. Ho controllato tutti i file java e non è nel mio progetto. Sono così confuso, e non sto usando maven o gradle, solo il valore predefinito progetto Java. Non ho idea di cosa sta succedendo.

Ecco un esempio:

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

Un errore dicendo che è Impossibile risolvere il simbolo NotNul : 10" (di nuovo @ davanti)

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

Migliore risposta

0

Java stesso non viene fornito con queste annotazioni.

Invece, ci sono circa 10 reciprocamente incompatibili assume l'idea, la maggior parte dei quali lavorano in modo completamente diverso, e applicare diversi significati a ciò che NonNull significa, in cui si può mettere, e come funziona.

Fuori sede. Questo è molto sfortunato, come l'idea di base di utilizzo di annotazioni per aggiungere questa informazione è di gran lunga superiore alla Opzionale e tali, dato che sarebbe del tutto compatibile e non relegare il codice esistente nella cupezza di obsolecence, a differenza di Optional.

Quindi, trovare uno che ti piace, e includerlo nel progetto stesso modo si include terzi di dipendenza, di solito, da cui il Maven/Gradle/Ant+ivy/ecc (il file di compilazione dell'elenco delle dipendenze).

Intellij ha il suo prendere su un valore diverso da null e Nullable. È probabilmente il più conveniente. Le sue idee su ciò che queste annotazioni media inferiore1. Correttore Quadro è migliore, eclipse è un lontano secondo migliore, e tutto il resto (tra cui intellij) che condivide il terzo posto. il migliore è prendere per essere trovati nel Checker Quadro, o, quasi come una buona, eclipse queste annotazioni. Tuttavia, dubito intellij è null sistemi di controllo sono in grado di comprendere pienamente le sue più avanzate aggiunte, come ad esempio @PolyNullcosì questa ulteriore potenza espressiva vorresti essere in gran parte sprecato. Come bonus, intellij viene fornito con un sacco di dati sulla nullità annotazioni sarebbe sulle principali librerie.

Infine è importante: Più comunemente utilizzato le librerie java, tra cui java.* di per sé, non sono queste annotazioni, e di lavoro con mezza null-annotato il codice è sicuramente un altamente frustrante esercizio; i costi notevolmente superiori ai benefici. L'unica vera soluzione è quella di "fissare" le librerie che uso con la destra nullità info, ma questo è un sacco di lavoro. Fortunatamente, intellij ha fatto un sacco di esso per voi.

Mi sarei aspettato (eclipse fa), che il quickfix (CMD+1 su mac, CTRL+1 non-mac, almeno, fuori dalla scatola, se la mia memoria di scelte rapide da tastiera predefinite non mi serve) include "aggiungi automaticamente eclipse nullità annotazioni al classpath' (o, nel tuo caso, intellij, ovviamente). Se in qualche modo non l'apparire, Questa pagina dal intellij docs spiegare esattamente come per aggiungere la org.jetbrains.annotations la biblioteca, che contiene la loro nullità annotazioni, per il tuo progetto. Infatti, questi documenti indicano che, in effetti, il quickfix menu offre la possibilità di aggiungere automaticamente questa libreria come soluzione per l'errore che ricevi sul tuo @NonNull nodo del codice sorgente.

[1] la Maggior parte prende la nullità annotazioni limitano notevolmente, consentendo l'annotazione solo sui campi, metodi (sottinteso: Cosa restituisce), e i parametri. Tuttavia, si può sicuramente-non-null List potrebbe-essere-null Map le istanze, Mappa sicuramente non null String potrebbe essere null Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>. Il sistema di annotazione è in grado di permette di scrivere, ma solo se le annotazioni sono nata esclusivamente per TYPE_USE. correttore del quadro di riferimento e di eclipse nullità annotazioni e lavoro; la maggior parte gli altri non lo sono, e sono quindi meno espressivo. CheckerFramework un ulteriore passo avanti e consente di scrivere la nozione di 'o nullità è bene'. Proprio come i farmaci generici ha 3 forme (List<Integer>e List<? super Integer> e List< extends Integer>una volta generici sono coinvolti, 2 nullità (mai null, o sicuramente null è consentito) non è più sufficiente, è necessario un maggiore nullità. correttore quadro di riferimento ha @PolyNull si consente il collegamento di nullità: Si può ad esempio scrivere questo metodo in checkerframework ma non si può pretendere di scrivere correttamente digitato con intellij, o per quella materia di eclipse:

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

l'idea è: Questo metodo viene eseguito il matcher contro ogni elemento della lista, e dopo una partita, l'elemento viene aggiunto alla fine della lista. Questo metodo può funzionare se T è considerato '@non null' (dato che non contengono valori null sono in, null non può essere aggiunto dal presente codice, in modo che il non-nullità dei suoi elementi, che non possono essere violati da esso), ma funziona altrettanto bene se T è @Nullable, a condizione che il matcher è anche di @Nullable T di corso: Ora questo codice potrebbe aggiungere null alla lista, ma va bene così.

Così T non è né Annullabile, né diverso da null, ma il Ts citato nella firma ha bisogno di abbinare la loro nullità. @PolyNull risolve questo problema.

2021-11-22 22:56:48

In altre lingue

Questa pagina è in altre lingue

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