字符串缓冲区转换为字符串时出现异常?

4

您好,请查看下面的代码

   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 时遇到了类转换异常。
 java.lang.ClassCastException: java.lang.String
 at com.one.MainClass.main(MainClass.java:16)

但是当我尝试时

  System.out.println(z.get(0)) 

它正在工作 为什么会出现这种情况?


2
你想要实现什么目标? - AlanFoster
当您可以使用StringBuilder时,请不要使用StringBuffer。 - Peter Lawrey
2个回答

2

我假设你是在进行实验(如果不是,请阅读其他答案以了解如何编写代码)。

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

y.add("string")添加一个字符串。

z是一个ArrayList<StringBuffer>,期望的是StringBuffer。当你调用z.get(0)时,JVM会尝试将索引为0的元素转换为StringBuffer,然后返回它。但是这个转换失败了。

换句话说,虽然StringBuffer s = z.get(0);编译通过,但它会在运行时抛出ClassCastException,因为z.get(0)不是一个StringBuffer


1

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

  • 创建了一个新的ArrayList,为空
  • y中的所有元素都被类型化为String
  • z中的所有元素都被类型化为StringBuffer
  • 向此数组列表添加了一个新元素。
  • JVM尝试将其转换为String和StringBuffer
  • 由于“Strings”不是StringBuffer的实例,因此抛出ClassCastException。

为避免此问题,请不要将数组类型化为String和StringBuffer。只选择其中一个。例如:

ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer>

如果你想将一个String ArrayList复制到一个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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接