Actually I need to know at compile time that an unmodifiable list is being modified.
这是不可能的.
或者至少,如果不创建完全不同的集合接口/类层次结构,则是不可能的.这是一个坏主意,因为没有任何旨在使用常规集合的东西都可以使用它.
我想可以编写一个静态代码分析器来检测这种事情……在某些情况下……但这不是严格的“编译时间”.此外,我不知道任何现有的静态代码分析器可以“开箱即用”.
I wonder if there was a reason why they did it like this.
那么你没有办法做到这一点真的有用.
备选方案#1:
public interface UnmodifiableList {
public T get(int pos);
....
}
public interface List extends UnmodifiableList {
public void add(T elem);
....
}
虽然静态类型可以阻止我们使用不可修改的列表,其中需要可修改的列表,但反之则不然.每个List也是一个UnmodifiableList ……这并没有多大意义.
备选方案2:
public interface List {
public T get(int pos);
public void add(T elem);
....
}
public interface UnmodifiableList {
// A marker interface
}
现在,静态类型可以阻止我们使用可修改的列表,其中需要一个可修改的列表,但不能反过来. (这符合您的要求……)此外,实现UnmodifiableList的类仍继承add操作,并且没有什么可以阻止应用程序尝试调用它.
简而言之,静态类型系统不能充分地处理这种限制.