java - List.toArray(T[]) 的奇怪泛型行为

标签 java arrays list

我今天遇到了一些非常基本但非常令人困惑的事情。我需要将列表转换为数组。该列表包含 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/

相关文章:

java - 使用 JaxRS 自定义 JSON 序列化

java - 在Java中将文本文件读取到数组中

javascript - 修改 Array.forEach 以自动将上下文设置为调用方

python - 从不同列表动态构建字典

java - 想要但未调用 : Mockito PrintWriter

java - 具有多个图像的 Jpanel - 内存使用情况

JAVA:填充数组然后使用for循环显示

list - 在 Haskell 中压缩

java - 尝试使用 ArrayList 操作数组中的对象

java - 软件专利涵盖的操作系统项目的一个分支会发生什么情况?