Java 字符串缓冲区到字符串转换异常?

Java 字符串缓冲区到字符串转换异常?,java,arraylist,stringbuffer,Java,Arraylist,Stringbuffer,您好,请检查下面的代码 ArrayList x=new ArrayList(); ArrayList<String>y=x; ArrayList<StringBuffer>z=x; y.add("Strings"); System.out.println(z.get(0).toString()); 但是当我尝试的时候 System.out.println(z.get(0)) 它正在工作 为什么会这样 关于您遇到问题的具体原因如下:

您好,请检查下面的代码

   ArrayList x=new ArrayList();
   ArrayList<String>y=x;
   ArrayList<StringBuffer>z=x;
   y.add("Strings");
   System.out.println(z.get(0).toString());
但是当我尝试的时候

  System.out.println(z.get(0)) 
它正在工作
为什么会这样

关于您遇到问题的具体原因如下:

  • 已创建新的ArrayList,为空
  • 所有元素都被键入y中的字符串
  • 所有元素都被键入z中的StringBuffer
  • 将向该数组列表中添加新元素
  • JVM尝试将其强制转换为String和StringBuffer
  • 因为“Strings”不是StringBuffer的实例,所以会抛出ClassCastException
为了避免这种情况,不要将数组同时键入String和StringBuffer。只选择一个。例如:

ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer>
如果您知道多一点,例如它将是另一个类的子类,请使用
ArrayList我假设您这样做是作为一个实验(如果不是,那么请阅读其他关于您应该如何编写代码的答案)

x是一个原始的
ArrayList
,您可以在其中放置任何类型的对象

y.add(“字符串”)
添加字符串

z是一个
ArrayList
,需要StringBuffers。当您调用
z.get(0)
时,JVM会在返回它之前尝试将索引0处的元素强制转换为StringBuffer。那个演员阵容失败了


换句话说,尽管
stringbuffers=z.get(0)编译时,它将在运行时抛出ClassCastException,因为
z.get(0)
不是
StringBuffer

您试图实现什么?当您可以使用StringBuilder时,请不要使用StringBuffer。
ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer>
ArrayList x=new ArrayList();
ArrayList<String>y=x;
ArrayList<StringBuffer>z=new ArrayList<StringBuffer>();
for(String s : y)
    z.add(new StringBuffer(s));
ArrayList<?> x = new ArrayList<?>();