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

标签 java generics wildcard diamond-operator

如果我想做这样的事情:

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/22935719/

相关文章:

java - 使用蛮力求解 2Sat CNF 形式

C# 如何创建 KeyValuePair 的通用列表

c - 通用求和宏和嵌套宏扩展

c# - 不同节点类型的树

c# - 通配符搜索 LINQ

java - 如何删除饼图中部分标签周围的部分标签框

java - 联系人组 GROUP_VISIBLE 和 GROUP_IS_READ_ONLY 被忽略吗?

javascript通配符替换函数

java - 从 XML 属性文件 Autowiring Spring 构造函数参数

ssl - 通配符 SSL 证书是否可以在没有子域的情况下工作?