Java 将列表强制转换为ArrayList
当我想在从方法返回的Java 将列表强制转换为ArrayList,java,collections,casting,Java,Collections,Casting,当我想在从方法返回的列表引用中强制转换ArrayList对象时: public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 但此代码导致运行时错误: 线程“main”java.lang.ClassCastException中的异常: 无法将java.util.Arrays$ArrayList转换为java.util.ArrayList 为什么会发生这种情况?您可以将
列表
引用中强制转换ArrayList
对象时:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
但此代码导致运行时错误:
线程“main”java.lang.ClassCastException中的异常:
无法将java.util.Arrays$ArrayList转换为java.util.ArrayList
为什么会发生这种情况?您可以将其强制转换为ArrayList的假设是无效的
ArrayList
是实现List
接口的具体类型。不能保证方法asList
将返回这种类型的实现
实际上,使用的类型是java.util.Arrays$ArrayList
使用具体类而不是接口。可以被认为是坏习惯。如果您有特殊类型的类,并且希望向未来的开发人员提示该类型专用于该任务,那么这种方法会更好
但是API应该以最抽象的方式公开。这就是使用
列表的原因 您可以将其强制转换为ArrayList的假设无效
ArrayList
是实现List
接口的具体类型。不能保证方法asList
将返回这种类型的实现
实际上,使用的类型是java.util.Arrays$ArrayList
使用具体类而不是接口。可以被认为是坏习惯。如果您有特殊类型的类,并且希望向未来的开发人员提示该类型专用于该任务,那么这种方法会更好
但是API应该以最抽象的方式公开。这就是使用列表的原因 从Arrays.asList返回的ArrayList不是实际的ArrayList,它只是一个包装器。。。它不允许在列表中进行任何修改“包装器”是什么意思?从数组返回的ArrayList.asList不是实际的ArrayList,它只是一个包装器。。。哪个不允许在列表中进行任何修改?你说的“包装器”是什么意思??
String[] colors = { "black", "blue", "yellow" };
ArrayList<String> links = (ArrayList<String>) Arrays.asList(colors) ;