【问题标题】:What is reason for list couldn't convert into array?列表无法转换为数组的原因是什么?
【发布时间】:2015-01-26 03:23:22
【问题描述】:

我正在尝试将 List 类型的数据集合转换为数组。

    public void method1(List s1){
    List s=s1;
    String []array = new String[s.size()];
    array=(String[])s.toArray(); 
    for(int i=0;i<array.length;i++){
        System.out.println(array[i]);
    }
    }

然后发生以下类转换异常。错误行是“array=(String[])s.toArray();”行。

java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [Ljava.lang.String;

这是什么原因?

【问题讨论】:

标签: java arrays list arraylist classcastexception


【解决方案1】:

List.toArray()是接口List中的一个方法,文档并没有具体说明该方法返回什么样的数组。但是,与建议的其他答案不同,List.toArray() 方法无法返回列表的泛型类型的数组,因为列表的泛型类型在运行时是未知的。

因此,标准 API 中内置的 List 的所有实现都返回 Object[],而不是 String[]。

但是,您可以将自己的预分配数组传递给方法List.toArray(Object[])。如果你这样做,你保证得到一个与你传入的数组具有相同元素类型的返回值。如果你传入的数组与列表本身具有相同的大小,那么将使用该数组(否则,将在内部分配一个适当大小的新数组)

这将解决它:

public void method1(List s) {
    String[] array = s.toArray(new String[s.size()]);  // <-- pass the array as an argument
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
}

【讨论】:

  • 除非你不需要投射。 toArray(T[]) 方法是模板化的。
  • 不必创建正确大小的数组。 String[] array = s.toArray(new String[0]); 也可以。或者为了避免 empty array 警告使用 String[] array = s.toArray(new String[1]);
  • @Erwin Bolwidt Thanx 很多。这对我有用:)。祝你有美好的一天。
  • @Tom 创建一个错误大小的数组是个坏主意,因为这会创建一个您知道不需要的数组实例。无论 HotSpot 是否捕捉到这一点,这都是浪费。 new String[1] 的问题是,如果列表的大小为零,您仍然会得到一个大小为 1 的数组。
  • Tom: toArray(T[]) 方法将使用传入的数组,如果所有元素都可以放入其中。否则它将分配一个新数组。所以初始化一个列表大小的数组是有好处的。这是有道理的。
【解决方案2】:

您没有为列表指定泛型类型,而是将数组声明为字符串数组。这应该有效:

public void method1(List<String> s1){
    List<String> s=s1;
    String []array = new String[s.size()];
    array = (String[])s.toArray(array); 
    for(int i=0;i<array.length;i++){
        System.out.println(array[i]);
    }
}

编辑
您应该使用返回作为参数传入的类型的List#toArray(T[] a),而不是返回Object[] 的List#toArray()。

【讨论】:

  • OP 的注意事项:将 s1 分配给 s 只是提供对同一列表的引用。据我所知,它实际上并没有为你做任何事情。您可能可以省略该行。此答案的注意事项:Do array = s.ToArray(array);我相信这会奏效。
  • @TheRealDiel 你是对的,它有效。至于s = s1,我保留了那部分,因为 OP 发布的代码通常是一些更大更复杂代码的简化版本,因此将原始代码结构保留在答案中更容易应用于 OP 的真实代码.
  • 我明白了。这更像是对 OP 的评论,而不是对您的评论。我是这样记的。但我想我不应该回答我没有被问到的事情。 :)
  • @TheRealDiel 我知道这是给 OP 的,我只是解释了我的观点(回答了我没有被问到的问题):)
猜你喜欢
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多