gpt4 book ai didi

java - 带菱形运算符的通配符

转载 作者:搜寻专家 更新时间:2023-11-01 03:49:40 24 4
gpt4 key购买 nike

如果我想做这样的事情:

List<?> unknownList = new ArrayList<>();

然后代码可以正常编译和运行,但是 ArrayList 创建了哪种类型

在这一行之后,如果我这样做了:

        unknownList.add("str"); //compilation error

它给出了编译错误:

error: no suitable method found for add(String)
unList.add("str");
^
method List.add(int,CAP#1) is not applicable
(actual and formal argument lists differ in length)
method List.add(CAP#1) is not applicable
(actual argument String cannot be converted to CAP#1 by method invocation conversion)
method Collection.add(CAP#1) is not applicable
(actual argument String cannot be converted to CAP#1 by method invocation conversion)
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?

这是什么错误,使用带通配符的菱形运算符好吗?如果是,那么在哪里???

最佳答案

but of which type was the ArrayList created?

类型参数只是在编译时应用的约束,但是 type erasure 通过删除替换所有出现的类型参数(在您的情况下为 Object )。因此,如果您询问运行时类型,它将是普通的 ArrayList。 (您可以将其视为 ArrayList<Object>)。

is it good to use the diamond-operator with wildcards? If YES then WHERE???

没有。当您使用菱形运算符创建泛型类的新对象时,这意味着您不想在类型参数上出现冗余。它不应与没有具体类型参数的通配符声明变量结合使用。

总而言之,你不应该这样写:

List<?> unknownList = new ArrayList<>();

您应该只使用通配符 <?>当类型真的无关紧要时。特别是,如果您想向列表中添加项目,请不要使用通配符,因为添加项目意味着您知道要添加的类型

它很可能用作方法的参数,例如,当您不访问值而只是传递列表时,或者您只是将列表项作为普通对象访问时。

关于java - 带菱形运算符的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31860261/

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