繁体   English   中英

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

[英]What is the type of unmodifiable list in java

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

List<String> unModifiableStringList = Collections.unmodifiableList(myActualModifiableList);

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

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

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

这是不可能的。

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

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


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

那么没有一个方法,你可以这样做真的管用。

备选方案#1:

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

 public interface List<T> extends UnmodifiableList<T> {
     public void add(T elem);
     ....
 }

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

备选方案2:

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

 public interface UnmodifiableList<T> {
     // A marker interface
 }

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

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

你试过unModifiableStringList.getClass().getName()吗?

它给了我

java.util.Collections$UnmodifiableRandomAccessList

从源代码中可以看出,它是一个包访问静态内部类的Collections

它是

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                      implements List<E>

static class UnmodifiableRandomAccessList<E> extends UnmodifiableList<E>
                                      implements RandomAccess

static class UnmodifiableCollection<E> implements Collection<E>, Serializable

它是Collections内部类,因为Collections是不可实例化的,它是具有包可见性的内部类,你不能访问类,它是隐藏在OOP中的实现。

请参阅: http//grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.unmodifiableList%28java.util.List%29

它是Collections的内部类:

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                                 implements List<E>

Debug显示运行时类型是Collections.UnmodifiableRandomAccessList ,因此它是内部类。 代码分析还显示它可能是Collections.UnmodifiableList

你不应该尝试访问这个类,它应该是不可变的。 尝试使用通用接口,在这种情况下= Collection

你的陈述清楚地说明了它仍然引用了List但它禁止修改列表。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#unmodifiableList(java.util.List

如果您共享不可修改的列表引用,请确保没有人更改它并允许只读操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM