2013-05-13 25 views
1

当我想铸ArrayList对象,从所述方法返回List参考:投清单ArrayList的

public static <T> List<T> asList(T... a) { 
    return new ArrayList<>(a); 
} 

从方法asList返回类型是一个List参照ArrayList对象,这意味着我可以将其转换为ArrayList参考。 使得:

String[] colors = { "black", "blue", "yellow" }; 
ArrayList<String> links = (ArrayList<String>) Arrays.asList(colors) ; 

但这个代码所做的运行时错误:

在线程异常 “主要” java.lang.ClassCastException: java.util.Arrays中的$ ArrayList中不能被强制转换为java.util.ArrayList

为什么会发生?

+0

ArrayList的是不是一个实际的数组列表,它只是一个包装......这些犯规允许列表中的 – 2013-05-13 09:32:56

+0

你的意思是“包装”一下任何修改? – Aladdin 2013-05-13 09:40:06

回答

4

你的假设,你可以把它转换到ArrayList是无效的。

ArrayList是实现List接口的具体类型。不保证方法asList,将返回这种类型的实现。

实际上使用的类型是java.util.Arrays$ArrayList

使用具体类而不是接口。可以被认为是不好的做法。这种方法是更好的,当你有特殊类型的类,你想给的,这种类型的专门用于任务未来开发商的提示。

但API应该以最抽象的方式公开。这就是使用List的原因。是从Arrays.asList返回