4

我正在尝试为静态内部类 Map.Entry 编写一个 Eclipse 外部注释文件。我该怎么做呢?

我在所有外部注释文件所在的文件夹下的子文件夹中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;

entry.getValue()Eclipse 仍然在以下代码中标记警告:

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.
4

2 回答 2

2

之后的第二行getValue必须代替for : ()T1V; ()TV;@NonNull

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

因为@Nullable它会 ()T0V;

但是因为映射条目的值可以为空(“映射也有可能显式地将键映射到空”@NonNull Object value = entry.getValue(); ),如果类型为entryis而不是如果类型为则应该只出现警告。要告诉 Eclipse在设计时考虑到了空类型注释,文件必须几乎是空的:Map.Entry<String, @Nullable Object>Map.Entry<String, @NonNull Object>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 - 使用泛型改进空分析

于 2017-08-27T13:50:44.730 回答
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();
于 2017-09-12T15:48:52.860 回答