【问题标题】:ArrayList toArray method class cast exception [duplicate]ArrayList toArray方法类转换异常[重复]
【发布时间】:2014-01-24 01:00:51
【问题描述】:

我不明白为什么这给了我一个类转换异常:

List<String> names = new ArrayList<String>();
for (ApplicationInfo app : apps) {
    names.add("" + app.loadLabel(packageManager));
}
return (String[]) names.toArray();

日志是:

01-23 16:56:18.746: E/AndroidRuntime(4027): Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

但我明确将names 定义为String 的列表,而不是Object

**编辑:

哦,等等,好吧,我在 API 中看到它返回对象数组。我怎么能不这样做:

List<String> names = new ArrayList<String>();
for (ApplicationInfo app : apps) {
    names.add("" + app.loadLabel(packageManager));
}
String[] list = new String[names.size()];
return names.toArray(list);

并且每次都创建一个新数组?

【问题讨论】:

  • 您可以在数组列表上循环并将字符串推送到您的数组中并返回它

标签: java android


【解决方案1】:

基于javadoc,您可以这样做:

String[] list = names.toArray(new String[0]);

【讨论】:

  • 我喜欢 javadoc 的解决方案。
【解决方案2】:

类转换异常发生只是因为 toArray() 返回 Object[]Object[] 肯定不能转换为 String[]

相反,你可以使用这个:

String[] list = toArray(new String[names.size()]);

返回正确的演员表(String[])。

【讨论】:

    【解决方案3】:

    您只需要直接或间接由您执行。有人必须创建一个数组(大小正确)来保存结果。

    new String[0] 用于虚拟对象,但您将创建两个对象。

    如果您认为额外的数组对象很重要,您应该重用 String[] 对象,或者只使用 List 而不转换为数组。

    【讨论】:

    • 超过 10k 代表并且您发布答案而不是标记为重复?如果这个答案比副本更好或更完整,那么它会飞但是这个......
    【解决方案4】:

    您正在处理泛型,在运行时它无法识别要创建的数组类型以及要分配给该数组的大小。

    一个非常简单的工作解决方案。

    ApplicationInfo a1  = new ApplicationInfo("label1");
        ApplicationInfo a2  = new ApplicationInfo("label2");
        ApplicationInfo a3  = new ApplicationInfo("label3");
    
        List<ApplicationInfo> infos = new ArrayList<ApplicationInfo>();
        infos.add(a1);
        infos.add(a2);
        infos.add(a3);
    
        ArrayList<String> labels = new ArrayList<String>();
        for (ApplicationInfo info : infos) {
            labels.add(info.getLabel().toString());
        }
    
        String[] lbls = labels.toArray(new String[labels.size()]);
        for (int i = 0; i < lbls.length; i++) {
            System.out.println(lbls[i]);
        }
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      String[] list = new String[0];
      return names.toArray(list);
      

      您不需要为数组的大小分配额外的空间。

      【讨论】:

      • 首先,这个答案没有提供任何解释。其次,这个问题显然是重复的。三、为什么要分配两个数组?
      • @BoristheSpider 她需要更多关于堆栈溢出的积分:'(
      猜你喜欢
      • 2015-11-10
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2023-03-03
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多