1

当我想在从方法返回的引用中转换ArrayList对象时:List

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

该方法的返回类型asListList对对象的引用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

为什么会这样?

4

1 回答 1

4

您可以将其转换为 ArrayList 的假设是无效的。

ArrayList是实现List接口的具体类型。不保证 methodasList会返回这种类型的实现。

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

使用具体类而不是接口。可以被认为是不好的做法。当您有特殊类型的类并且您想向未来的开发人员提示这种类型专用于该任务时,这种方法会更好。

但是 API 应该以最抽象的方式公开。这就是List使用 的原因。

于 2013-05-13T09:43:07.153 回答