実際、コンパイル時に、変更できないリストが変更されていることを知る必要があります。
それは不可能です。
または、少なくとも、完全に異なるコレクションインターフェイス/クラス階層を作成しないと不可能です。通常のコレクションを使用するように設計されたものは何も機能しないため、これは悪い考えです。
この種のことを検出できる静的コードアナライザーを作成することは可能だと思います...場合によっては...しかし、それは厳密には「コンパイル時」ではありません。その上、私はこれを「箱から出して」行う既存の静的コードアナライザーを知りません。
彼らがこのようにした理由はあったのだろうか。
さて、これを行う方法はどれも実際には機能しません。
代替案#1:
public interface UnmodifiableList<T> {
public T get(int pos);
....
}
public interface List<T> extends UnmodifiableList<T> {
public void add(T elem);
....
}
静的型付けは、変更可能なリストが必要な場合に変更不可能なリストを使用することを防ぐことができますが、その逆は当てはまりません。すべてのリストもUnmodizableListです...そしてそれは本当に意味がありません。
代替案2:
public interface List <T> {
public T get(int pos);
public void add(T elem);
....
}
public interface UnmodifiableList<T> {
// A marker interface
}
これで、静的型付けにより、変更可能なリストが必要な場合に変更可能なリストを使用できなくなりますが、その逆はできません。(それはあなたの要件に合っています...)さらに、実装するクラスはUnmodifiableList
まだ操作を継承しadd
、アプリケーションがそれを呼び出そうとするのを止めるものは何もありません。
つまり、静的型システムでは、この種の制限を適切に処理できません。