簡體   English   中英

三元運算符無法識別Eclipse中的編譯錯誤

[英]Ternary operator does not recognize compile error in Eclipse

我正在使用Eclipse作為IDE,並具有以下代碼

List<Long> countList = new ArrayList<>();
Long count = (countList != null && !countList.isEmpty()) ? countList.get(0) : 0;

在Eclipse中,else的自動裝箱會產生編譯錯誤,但不會。 我也嘗試了最新的Eclipse版本Photon,但仍然相同。

但是,當我使用Jenkins構建項目時,它會拋出適當的編譯錯誤。 有人可以建議如何解決此問題嗎?

我嘗試了設置Preferences -> Errors/Warnings -> Boxing and unboxing conversions ,並將默認行為從警告變為錯誤。 但這也會導致其他不必要的錯誤。

有沒有一種方法可以通過日食設置解決此問題?

這不是Eclipse中的錯誤,而是javac的錯誤。 它僅影響Java 8,因此使用其他版本可以解決此問題。

注意,雖然像Long var = 0;這樣的構造Long var = 0; 規范不允許,條件表達式是一個完全不同的字段。

Java語言規范中有關“ 條件運算符? 具有數值條件表達式的概念,甚至顯式包含一個轉換表 ,該顯示Long類型的第二個參數和int類型的第三個參數的組合應該是有效的,其結果類型為“ bnp(Long,int) ” ,而“ bnp”代表“ 二進制數字推廣 ”¹

¹我故意鏈接到規范的Java 8版本,該版本是javac表現出這種錯誤行為的版本。

簡而言之,這意味着在需要時取消裝箱,然后在需要時擴大原始轉換,最后,在需要時將結果再次裝箱。

請注意,只要不涉及通用方法,即使Java 8的javac都能正確執行此操作:

Long boxed = !countList.isEmpty()? countList.get(0): null;
Long count = boxed != null? boxed: 0;// promotes int to Long

不產生編譯器錯誤。

JDK-8162708中已描述了涉及泛型方法時產生編譯器錯誤的行為, 以及三元運算符和泛型方法的意外語法錯誤 它還提到javac確實在Java 7和Java 9下正確處理了此構造,因此問題僅在Java 8中發生。我還驗證了在Java 11和Java 12的當前狀態下未出現編譯器錯誤。

值得指出的是,上述規則可能具有違反直覺的行為。 例如

boolean someCondition = true;
Long variable = null;
Long other = someCondition? variable: 0;

將拋出NullPointerException ,因為未傳遞存儲在variable的引用,但將取消裝箱並再次裝箱。

同樣,

Integer variable = 42;
Long other = variable;

不是有效的分配,但

Integer variable = 42;
Long other = true? variable: 0L;

是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM