我今天遇到了一些非常基本但非常令人困惑的事情。我需要将列表转换为数组。该列表包含 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
type 还会改变该类中泛型方法的工作方式。
第二次编辑:
我想我现在明白了。 Tom Hawtin 在下面的评论中写的似乎是最好的解释。如果您以原始方式使用泛型类型,则该实例中的所有泛型信息都将被编译器删除。
最佳答案
您忘记为您的列表指定类型参数:
List<String> l = Arrays.asList("a", "b", "c");
在这种情况下,您可以编写安全性:
String[] a = l.toArray(new String[0]);
没有任何类型转换。
关于java - List.toArray(T[]) 的奇怪泛型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073786/