- 我有一个具有类似地图功能的接口,但没有实现 Java 的 Map 接口。
- 地图接口也实现了
Iterable<Object>
;它遍历地图的键 - 我想
this
在增强循环的主体中使用(见下文),但没有断言,并用于get
检索迭代键的值,并且没有[ERROR]
来自 Checker Framework。 - 这完全有可能吗?您能否提供从哪里开始的指示或可供学习的示例?我随意地尝试
@KeyFor
在这里和那里撒一些 s,但是由于缺乏完全了解我在做什么,可能需要一段时间才能找到正确的位置 ;-) - 我知道我们可能会使用“Entry Iterator”并避免首先解决这个问题,但我真的只是想学习如何教 Checker 框架关于键迭代器和
@Nullable get
方法之间的语义关系。
这是一个最小的工作示例:
import org.checkerframework.checker.nullness.qual.Nullable;
interface IMap extends Iterable<Object> {
@Nullable Object get(Object o);
IMap put(Object key, Object value); // immutable put
IMap empty();
default IMap remove(Object key) {
IMap tmp = empty();
for (Object k : this) {
if (!k.equals(key)) {
tmp.put(k, get(k)); // get(k) is always non-null because of the key iterator
}
}
return tmp;
}
}
class Map implements IMap {
java.util.Map<Object, Object> contents = new java.util.HashMap<>();
public Map() { }
private Map(java.util.Map<Object, Object> contents) {
this.contents = contents;
}
@Override
public @Nullable Object get(Object key) {
return contents.get(key);
}
@Override
public IMap empty() {
return new Map();
}
@Override
public IMap put(Object key, Object value) {
java.util.Map<Object, Object> newContents = new java.util.HashMap<>();
newContents.putAll(contents);
newContents.put(key, value);
return new Map(newContents);
}
@Override
public java.util.Iterator<Object> iterator() {
return contents.keySet().iterator();
}
}