的细节,为什么你得到你的问题是这样的:
- 新的ArrayList创建,空
- 所有元素类型为String y中
- 所有元素都输入到的StringBuffer在z
- 将新元素添加到此数组列表中。
- JVM尝试将其转换为BOTH字符串和StringBuffer
- 由于“字符串”不是StringBuffer的实例,因此抛出了ClassCastException。
为了避免这种情况,请不要为String和StringBuffer类型输入数组。只选择一个。例如:
ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer>
如果你想为一个字符串数组列表复制到一个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。造成问题的原因是您无法投射字符串,比如说“str”指向StringBuffer,即您无法执行StringBuffer s = (StringBuffer)"str";
。
要将ArrayList x
投射到ArrayList<T>
,所有x
元素必须扩展或成为T
的实例。
另外,您应该尽可能使用泛型类型。如果你不知道会是什么(例如)在列表中,使用方法:
ArrayList<?> x = new ArrayList<?>();
如果你知道更多一点,比如,这将是另一个类的子类,使用 ArrayList<? extends T>
或ArrayList<? implements T>
。这将帮助您避免将来的ClassCastExceptions。
你想达到什么目的? – AlanFoster 2012-08-05 15:42:17
请不要在使用StringBuilder时使用StringBuffer。 – 2012-08-13 07:58:12