我正在尝试为静态内部类Map.Entry编写Eclipse External Annotation文件。我该怎么做?
我在所有外部注释文件所在的文件夹下的Map$Entry.eea
子文件夹中创建了一个名为java/util
的文件。以下是该文件的内容。
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 :(得分:2)
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
答案 1 :(得分:0)
升级到Eclipse Oxygen(4.7.0)build 20170620-1800解决了这个问题。 Map$Entry.eea
可以保留在问题中,编译器警告会在适当的时间发生。如果代码中的Map.Entry
V
为@NonNull
,则getValue()
的返回类型为@NonNull
。如果代码中Map.Entry
V
为@Nullable
,则getValue()
的返回类型为@Nullable
。
问题中的代码不再导致编译器警告。以下代码(预期和期望)。
Map.Entry<@NonNull String, @Nullable Object> entry;
...
entry.getValue().toString();