ArrayList toArray方法类强制转换异常

时间:2014-01-24 01:00:52

标签: java android

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

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);

每次制作一个新阵列?

5 个答案:

答案 0 :(得分:4)

根据javadoc,你可以这样做:

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

答案 1 :(得分:3)

因为 toArray()返回对象[] ,因此发生了类强制转换异常。当然 Object [] 无法转换为 String []

相反,你可以使用它:

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

返回正确的强制转换(String [])。

答案 2 :(得分:1)

你必须由你直接或间接地。有人必须创建一个数组(具有正确的大小)来保存结果。

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

如果您认为其他数组对象有用,则应重新使用String []对象,或者只使用List而不转换为数组。

答案 3 :(得分:1)

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

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

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]);
    }

答案 4 :(得分:0)

你可以这样做:

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

您无需为数组大小分配额外空间。