什么是静态内部类的Eclipse外部注释格式?

时间:2017-02-03 17:10:26

标签: eclipse external-annotations

我正在尝试为静态内部类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.

2 个答案:

答案 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();