2017-02-03 126 views
4

我正在嘗試爲靜態內部類Map.Entry編寫Eclipse外部註釋文件。我該怎麼做呢?什麼是靜態內部類的Eclipse外部註釋格式?

我在java/util子文件夾下創建了一個名爲Map$Entry.eea的文件,其中包含我的所有外部註釋文件所在的文件夾。這是該文件的內容。

class java/util/Map$Entry 

comparingByKey 
<K::Ljava/lang/Comparable<-TK;>;V:Ljava/lang/Object;>()Ljava/util/Comparator<Ljava/util/Map$Entry<TK;TV;>;>; 
<K::Ljava/lang/Comparable<-TK;>;V:Ljava/lang/Object;>()L1java/util/Comparator<L1java/util/Map$Entry<T1K;TV;>;>; 

comparingByKey 
<K:Ljava/lang/Object;V:Ljava/lang/Object;>(Ljava/util/Comparator<-TK;>;)Ljava/util/Comparator<Ljava/util/Map$Entry<TK;TV;>;>; 
<K:Ljava/lang/Object;V:Ljava/lang/Object;>(L1java/util/Comparator<-TK;>;)L1java/util/Comparator<L1java/util/Map$Entry<TK;TV;>;>; 

comparingByValue 
<K:Ljava/lang/Object;V::Ljava/lang/Comparable<-TV;>;>()Ljava/util/Comparator<Ljava/util/Map$Entry<TK;TV;>;>; 
<K:Ljava/lang/Object;V::Ljava/lang/Comparable<-TV;>;>()L1java/util/Comparator<L1java/util/Map$Entry<TK;T1V;>;>; 

comparingByValue 
<K:Ljava/lang/Object;V:Ljava/lang/Object;>(Ljava/util/Comparator<-TV;>;)Ljava/util/Comparator<Ljava/util/Map$Entry<TK;TV;>;>; 
<K:Ljava/lang/Object;V:Ljava/lang/Object;>(L1java/util/Comparator<-TV;>;)L1java/util/Comparator<L1java/util/Map$Entry<TK;TV;>;>; 

equals 
(Ljava/lang/Object;)Z 
(L0java/lang/Object;)Z 

getKey 
()TK; 
()TK; 

getValue 
()TV; 
()TV; 

setValue 
(TV;)TV; 
(TV;)TV; 

的Eclipse仍標誌下面的代碼上entry.getValue()警告:

Map.Entry<@Nullable String, @NonNull Object> entry; 
@NonNull Object value = entry.getValue(); 

的警告是:

Unsafe interpretation of method return type as '@NonNull' based on the receiver type 
'Map.<@NonNull Entry<@Nullable String, @NonNull Object>>'. Type Map.Entry<K, V> doesn't seem 
to be designed with null type annotations in mind. 

回答

0

第二行getValue必須()T1V;而不是()TV;@NonNull

class java/util/Map$Entry 
getValue 
()TV; 
()T1V; 

對於@Nullable這將是()T0V;

但因爲地圖項的值可以爲空("it's also possible that the map explicitly maps the key to null"),應該只有在@NonNull Object value = entry.getValue();警告如果entry類型是Map.Entry<String, @Nullable Object>,但如果類型爲Map.Entry<String, @NonNull Object>則不適用。要告訴Eclipse是Map.Entry是設計時考慮空類型註釋java/util/Map$Entry.eea文件必須幾乎是空的

class java/util/Map$Entry 

但要小心,如果你做Map一樣,那麼就不會有對任何警告@NonNull Object o = map.get("foo");。你必須明確地標註所有@Nullable類型參數:

class java/util/Map 
get 
(Ljava/lang/Object;)TV; 
(Ljava/lang/Object;)T0V; 

參見:Eclipse 4.6 New and Noteworthy - Improved null analysis with generics

+0

如果我有一個'Map.Entry的<@Nullable字符串,@NonNull對象>取值範;'和'Map.Entry的<@Nullable字符串,@Nullable對象> ENTRY2;'。在一種情況下,我需要'()T1V;'在另一種情況下,我需要'()T0V;'。我如何處理這兩種情況? – Nathan

+0

對於某些地圖,允許使用空值(即@Nullable V)。對於其他地圖,不允許使用空值(即@NonNull V)。在後一種情況下,Map.get()可以返回null,但是Map.Entry.getValue()不會返回null。這太糟糕了,我們無法指定'()TV;並且Eclipse會查看'V'的定義來確定它是否爲@NonNull或@Nullable。 – Nathan

+0

如果有這個類的外部註釋文件,但是沒有針對此特定方法的V的外部註釋,那麼Eclipse會查看V的定義以確定它是否爲「@ NonNull」或「@ Nullable」。 – howlger

0

升級到Eclipse氧(4.7.0)建立20170620-1800解決了這個問題。 Map$Entry.eea可以保留在問題中,編譯器警告在適當的時候發生。如果代碼中Map.EntryV@NonNull,則getValue()的返回類型爲@NonNull。如果代碼中Map.EntryV@Nullable,則getValue()的返回類型爲@Nullable

問題中的代碼不再導致編譯器警告。下面的代碼(這是預期的和期望的)。

Map.Entry<@NonNull String, @Nullable Object> entry; 
... 
entry.getValue().toString(); 
相關問題