关于您遇到问题的具体原因如下:
- 新的 ArrayList 已创建,为空
- 所有元素都输入到 String in y
- 所有元素都输入到 z 中的 StringBuffer
- 一个新元素被添加到这个数组列表中。
- JVM 尝试将其转换为 String 和 StringBuffer
- 因为“Strings”不是 StringBuffer 的实例,所以抛出 ClassCastException。
为避免这种情况,不要将数组类型化为 String 和 StringBuffer。只选择一个。例如:
ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer>
如果要将 String 数组列表复制到 StringBuffer ArrayList 中,则必须遍历 z 中的所有项目以将它们转换为字符串缓冲区:
ArrayList x=new ArrayList();
ArrayList<String>y=x;
ArrayList<StringBuffer>z=new ArrayList<StringBuffer>();
for(String s : y)
z.add(new StringBuffer(s));
原因是 StringBuffer 不扩展 String。导致问题的原因是您不能将字符串转换为字符串,例如对 StringBuffer 说“str”,即您不能这样做StringBuffer s = (StringBuffer)"str";
。
要ArrayList x
转换为ArrayList<T>
, 的所有元素都x
必须是扩展的或者是 的实例T
。
此外,如果可能,您应该始终使用泛型类型。如果您不知道列表中的内容(例如),请使用:
ArrayList<?> x = new ArrayList<?>();
如果您知道更多,例如它将是另一个类的子类,请使用
ArrayList<? extends T>
or ArrayList<? implements T>
。这将帮助您避免未来的 ClassCastExceptions。