public class Demo {
private final List<E> blah;
public demo(final List<E> result) {
super();
this.blah = Collections.unmodifiableList(result);
}
public List<E> getResult() {
return blah;
}
public static void main(final String args[]) {
final Demo d = new Demo(Collections.EMPTY_LIST);
System.out.println(d.getResult().get(0));
}
}
会发生什么以及为什么。转变是什么?如果我尝试做第1行,那么通用性会丢失吗?
答案 0 :(得分:2)
我认为你的问题在概念上是错误的。
在Collection的特定位置访问元素是相当奇怪的。这意味着您确定在特定位置上存在特定元素。集合总是一组某种类型的元素。只访问特定元素,您可以为特定元素赋予一些特定含义。使用
迭代集合是一种好习惯for(Object o: collection){...}
如果您希望从get(i)
中对for
等特定元素进行特定访问,则始终必须检查该元素是否存在。像
if(collection.size() > i)
{
//do operation
}
一般想法:您可以使用Map,其中具有特定含义(键)的元素被映射到此含义(键)。
编辑:刚刚检查过,EMPTY_LIST是不可变的,如果你想能够添加元素(然后用一些get(i)
访问它们),你必须像普通列表一样创建它
final List<String> list = new ArrayList<String>();
答案 1 :(得分:0)
它会抛出和IndexOutOfBoundsException。你为什么不测试它?
答案 2 :(得分:0)
首先测试它是否为空... EMPTY_LIST也不是类型安全的。
final List<String> list = Collections.emptyList();
if (!list.isEmpty()) {
System.out.println(list.get(0));
}
答案 3 :(得分:0)
final List<String> list = Collections.EMPTY_LIST;
这会创建一个空列表,这意味着它的大小为0.之后你调用了
list.get(0)
导致ArrayIndexOutOfBoundsException