gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:34:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com