- マップのような機能を持つインターフェイスがありますが、Java の Map インターフェイスを実装していません。
- マップ インターフェイスも実装し
Iterable<Object>
ます。マップのキーを反復します this
強化されたループ (以下を参照) の本体で使用したいと思いますが、アサーションは使用get
せず、反復キーの値を取得するために使用し[ERROR]
、Checker フレームワークから を使用しません。- それはまったく可能ですか?どこから始めるべきか、または学ぶべき例を教えていただけますか? 無計画に sを散りばめようと
@KeyFor
しましたが、自分が何をしているのかを完全に理解していないため、適切な場所に到達するまでに時間がかかる可能性があります ;-) - 「エントリ イテレータ」を使用して、そもそもこの問題を解決する必要がないようにすることは理解していますが、キー イテレータとメソッドの間のセマンティックな関係についてチェッカー フレームワークに教える方法を学ぶことに本当に興味があります
@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();
}
}