gpt4 book ai didi

java - 实现 Map.entrySet 时出现 'mismatching null constraints' 错误(Java8、Eclipse)

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:06 25 4
gpt4 key购买 nike

我收到错误...

The return type is incompatible with 'Set<Map.Entry<K,T>>' returned from Map<K,T>.entrySet() (mismatching null constraints)

...当实现 Map 并重写 Map.entrySet 时,如下所示:

package org.abego.util;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
...
public abstract class MyMap<K, T> implements Map<K, T> {
private Map<K, T> map = new LinkedHashMap<>();

@Override
public Set<java.util.Map.Entry<K, T>> entrySet() {
return map.entrySet();
}
...
}

org.abego.util将默认的空值定义为@NonNull:

@org.eclipse.jdt.annotation.NonNullByDefault
package org.abego.util;

我发现消除该错误的唯一方法是使用 @NonNullByDefault({}) 注释“删除 entrySet 的默认空注释”:

package org.abego.util;
...
import org.eclipse.jdt.annotation.NonNullByDefault;

public abstract class MyMap<K, T> implements Map<K, T> {
...
@Override
@NonNullByDefault({})
public Set<java.util.Map.Entry<K, T>> entrySet() {
return map.entrySet();
}
...
}

虽然这确实有效,但我想知道这是否是修复错误的正确方法。

(我使用的是 Eclipse 4.5 (Mars) 和 jdk1.8.0_60。)

最佳答案

您正在尝试重写此方法:

Set<Map.Entry<K, V>> entrySet();

使用有效签名为的方法

@NonNull Set<@NonNull Map.Entry<K, V>> entrySet();

这是一个不兼容的覆盖,可以通过此调用者演示:

Set<Map.Entry<Foo,Bar>> entries = someMap.entrySet();
entries.add(null);

如果someMap类型为MyMap那么元素类型为entries@NonNull ,但是java.util.Map.entrySet()的合约 promise Set哪里null元素是可以容忍的(集合没有指定其元素为空)。在同一个对象 @NonNull 上混合两个合约(带有 entries 和未指定)将破坏假定非空元素的客户端。

查看 entrySet() 的 Javadoc ,但是应该可以安全地假设 Map.entrySet()始终返回 Set与非空元素。因此,问题的根源在于 java.util.Map.entrySet()没有空注释。

自从火星 eclipse 以来,这个问题可以通过 external null annotations 来克服。你可以告诉编译器 Map.entrySet() 的返回类型事实上是@NonNull Set<@NonNull Map.Entry<K,V>> ,或者通过应用 Annotate command在 IDE 中,或者将以下代码片段放入文件 java/util/Map.eeaconfigured as the location for external annotations 的目录中对于 JRE:

class java/util/Map

entrySet
()Ljava/util/Set<Ljava/util/Map$Entry<TK;TV;>;>;
()L1java/util/Set<L1java/util/Map$Entry<TK;TV;>;>;

有了这样的外部注释,您的程序将被 JDT 的空分析所接受。

关于java - 实现 Map.entrySet 时出现 'mismatching null constraints' 错误(Java8、Eclipse),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32539321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com