java中不可修改列表的类型是什么

6 java collections

java中的不可修改列表可以创建为:

List<String> unModifiableStringList = Collections.unmodifiableList(myActualModifiableList);
Run Code Online (Sandbox Code Playgroud)

这很好,但是上面函数返回的列表的实际运行时类型是什么?我们怎样才能访问该课程?它甚至可能吗?

更新:实际上我需要在编译时知道正在修改一个不可修改的列表,因为我必须处理很多列表,其中一些是可修改的,而另一些则不是.跟踪是非常麻烦的吗?

Ste*_*n C 9

实际上我需要在编译时知道正在修改一个不可修改的列表.

这是不可能的.

或者至少,如果不创建完全不同的集合接口/类层次结构,则是不可能的.这是一个坏主意,因为没有任何旨在使用常规集合的东西都可以使用它.

我想可以编写一个静态代码分析器来检测这种事情......在某些情况下......但这不是严格的"编译时间".此外,我不知道任何现有的静态代码分析器可以"开箱即用".


我想知道他们是否有这样做的理由.

那么没有一个方法,你可以做到这一点真的管用.

备选方案#1:

 public interface UnmodifiableList<T> {
     public T get(int pos);
     ....
 }

 public interface List<T> extends UnmodifiableList<T> {
     public void add(T elem);
     ....
 }
Run Code Online (Sandbox Code Playgroud)

虽然静态类型可以阻止我们使用不可修改的列表,其中需要可修改的列表,但反之则不然.每个List也是一个UnmodifiableList ......这并没有多大意义.

备选方案2:

 public interface List <T> {
     public T get(int pos);
     public void add(T elem);
     ....
 }

 public interface UnmodifiableList<T> {
     // A marker interface
 }
Run Code Online (Sandbox Code Playgroud)

现在,静态类型可以阻止我们使用可修改的列表,其中需要一个可修改的列表,但不能反过来.(这符合您的要求...)此外,实现的类UnmodifiableList仍然继承add操作,并且没有什么可以阻止应用程序尝试调用它.

简而言之,静态类型系统不能充分地处理这种限制.

  • 作为一般规则,您应该编写接口而不是实际的运行时类.实际上,`Collections.unmodifiableList`被设计为_force_您编码到接口. (2认同)