java中的不可修改列表可以创建为:
List<String> unModifiableStringList = Collections.unmodifiableList(myActualModifiableList);
这很好,但是上面函数返回的列表的实际运行时类型是什么?我们怎样才能访问该课程?它甚至可能吗?
UPDATE:实际上我需要在编译时知道正在修改一个不可修改的列表,因为我必须处理很多列表,其中一些是可修改的,而另一些则不是。那么跟踪是非常麻烦的吗?
答案 0 :(得分:9)
实际上我需要在编译时知道正在修改一个不可修改的列表。
这是不可能的。
或者至少,如果不创建完全不同的集合接口/类层次结构,则无法实现。这是一个坏主意,因为没有任何设计用于使用常规集合的东西都可以使用它。
我想可以编写一个静态代码分析器来检测这种事情......在一些情况下......但这不是严格的“编译时间”。此外,我不知道任何现有的静态代码分析器能够“开箱即用”。
我想知道他们是否有这样做的原因。
备选方案#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
操作,并且没有什么可以阻止应用程序尝试调用它。
简而言之,静态类型系统无法充分应对这种限制。
答案 1 :(得分:3)
您是否尝试过unModifiableStringList.getClass().getName()
?
对我来说,它给出了
java.util.Collections$UnmodifiableRandomAccessList
,从源代码可以看出,它是一个包访问静态内部类Collections
。
答案 2 :(得分:3)
是
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中的实现。
答案 3 :(得分:2)
这是Collections
中的内部类:
static class UnmodifiableList<E> extends UnmodifiableCollection<E>
implements List<E>
答案 4 :(得分:0)
Debug显示运行时类型为Collections.UnmodifiableRandomAccessList
,因此它是内部类。代码分析还显示它可能是Collections.UnmodifiableList
。
你不应该尝试访问这个类,它应该是不可变的。请尝试使用通用界面,在这种情况下= Collection
。
答案 5 :(得分:0)
你的陈述清楚地说明了它仍然引用了List但它禁止修改列表。
如果您共享不可修改的列表引用,请确保没有人更改它并允许只读操作。