【发布时间】:2010-11-07 14:38:36
【问题描述】:
我今天遇到了一些非常基本但非常令人困惑的事情。我需要将列表转换为数组。该列表包含String 实例。使用List.toArray(T[]) 的完美示例,因为我想要一个String[] 实例。但是,如果不将结果显式转换为 String[],它将无法工作。
作为测试场景,我使用了以下代码:
import java.util.Arrays;
import java.util.List;
public class MainClass {
public static void main(String args[]) {
List l = Arrays.asList("a", "b", "c");
String stuff[] = l.toArray(new String[0]);
System.err.println(Arrays.asList(stuff));
}
}
不编译。它几乎是 javadoc 中示例的精确副本,但编译器显示以下内容:
MainClass.java:7: incompatible types
found : java.lang.Object[]
required: java.lang.String[]
String stuff[] = l.toArray(new String[0]);
^
如果我向String[] 添加演员表,它将完美编译并运行。但是当我查看 toArray 方法的签名时,这并不是我所期望的:
<T> T[] toArray(T[] a)
这告诉我我不应该施放。怎么回事?
编辑:
奇怪的是,如果我将列表声明更改为:
List<?> l = Arrays.asList("a", "b", "c");
它也有效。或List<Object>。所以它不必像建议的那样是List<String>。我开始认为使用原始的List 类型也会改变该类中泛型方法的工作方式。
第二次编辑:
我想我现在明白了。 Tom Hawtin 在下面的评论中写的似乎是最好的解释。如果您以原始方式使用泛型类型,则该实例中的所有泛型信息都将被编译器删除。
【问题讨论】: