我正在使用 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”(再次@在前面)
uj5u.com熱心網友回復:
Java 本身不附帶這些注釋。
取而代之的是,大約有 10 種相互不兼容的想法,其中大多數的作業方式完全不同,并且將不同的含義應用于含義NonNull、放置位置以及作業方式。
錢幣。這是非常不幸的,因為使用注釋來添加這些資訊的基本思想遠遠優于 Optional 等,因為它將完全向后兼容并且不會將現有代碼降級為過時的低迷,不像Optional.
因此,找到您喜歡的一個,并將其包含在您的專案中,與包含任何第三方依賴項的方式相同——通常是將其包含在您的 Maven/Gradle/Ant ivy/etc(您的構建檔案的依賴項串列)中。
Intellij 對 NonNull 和 Nullable 有自己的看法。這可能是最方便的。它關于這些注釋的含義的想法是劣等的1。Checker Framework 是最好的,eclipse 是第二好的,其他所有東西(包括 intellij 的)都排在第三位。最好的方法是在 Checker Framework 中找到,或者幾乎同樣好的 eclipse 對這些注釋的看法。但是,我懷疑 intellij 的空檢查系統是否能夠完全理解其更高級的添加,例如@PolyNull,因此這種額外的表達能力將被浪費掉。作為獎勵,intellij 附帶了大量關于主要庫上正確的無效注釋的資料。
最后一個很重要:大多數常用的 java 庫,包括java.*它自己,都沒有這些注釋,并且使用半空注釋的代碼絕對是一個非常令人沮喪的練習;這樣做的成本遠遠超過收益。唯一真正的解決方案是使用正確的無效資訊“修復”您使用的庫,但這是大量作業。幸運的是,intellij 已經為你做了很多。
我希望(eclipse 這樣做),quickfix(Mac 上的 CMD 1,非 Mac 上的 CTRL 1,至少,如果我對默認鍵盤快捷鍵的記憶為我服務,則開箱即用)包括“自動添加 eclipse 的無效性”類路徑的注釋(當然,或者在您的情況下,intellij 的注釋)。如果不知何故沒有出現,intellij 檔案中的這個頁面準確解釋了如何將org.jetbrains.annotations包含其無效注釋的庫添加到您的專案中。事實上,這些檔案表明,確實,quickfix 選單確實為您提供了自動添加此庫作為解決@NonNull源代碼中節點上錯誤的解決方案的選項。
[1] 大多數采用無效注解的方式通過僅允許對欄位、方法(暗示:它回傳的內容)和引數進行注解而大大限制了自身。但是,可以有一個絕對不為空List的可能為空的Map實體,其中 Map 絕對不為空String到可能為空Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>。注釋系統能夠讓您撰寫它,但前提是您的注釋僅針對 TYPE_USE 設定。檢查器框架和 Eclipse 的無效注釋就是這樣作業的;大多數其他人沒有,因此表現力較差。CheckerFramework 更進了一步,讓您可以撰寫“無效都可以”的概念。就像泛型有 3 種形式 ( List<Integer>,List<? super Integer>和List< extends Integer>, 一旦涉及泛型,2 個空值(從不為空,或絕對允許為空)不再足夠,您需要更多的空值。checker framework has @PolyNullwill let you link nullities: 例如,您可以在 checkerframework 中撰寫此方法,但您不可能使用 intellij 或 eclipse 正確鍵入它:
public void duplicateFirstMatch(List<T> elems, Predicate<T> matcher);
其中的想法是:此方法針對串列中的每個元素運行匹配器,并在匹配時將該元素添加到串列的末尾。如果T被認為是“@NonNull”,則此方法可以作業(假設沒有空值,此代碼永遠不能添加空值,因此它的元素的非空性不會被它違反),但如果Tis @Nullable,@Nullable T當然前提是匹配器也是:現在這段代碼可能會向串列中添加 null ,但這沒關系。
因此T既不是 Nullable 也不是 NonNull,但簽名中提到的 T 確實需要匹配它們的空值。@PolyNull解決了這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368606.html
