我有一个具有类似地图功能的接口,但没有实现 Java 的 Map 接口。
地图接口还实现了Iterable<Object>
;它遍历地图的键
我想this
在增强循环的主体中使用(见下文),但没有断言,并用于get
检索迭代键的值,并且没有[ERROR]
来自 Checker Framework 的 an 。
这完全有可能吗?您能否提供从哪里开始的指示或可以学习的示例?我试着随意地在这里和那里洒一些@KeyFor
s,但是由于缺乏完全理解我在做什么,我可能需要一段时间才能找到正确的位置;-)
我知道我们可能会使用“条目迭代器”并避免首先解决这个问题,但我真的只是想学习如何向 Checker Framework 传授键迭代器和方法之间的语义关系@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();
}
}
红糖糍粑
偶然的你
相关分类