代码之家  ›  专栏  ›  技术社区  ›  guerda

泛型与问号

  •  15
  • guerda  · 技术社区  · 16 年前

    我想使用泛型列表,但初始化方法只返回 List .

    List tmpColumnList = aMethodToInitializeTheColumnList();
    tmpColumnList.add("ANICELITTLECOLUMN");
    

    Java指责我使用的是原始类型,我应该将列表参数化。 所以我添加了一个问号来参数化这个列表。

    List<?> tmpColumnList = aMethodToInitializeTheColumnList();
    tmpColumnList.add("ANICELITTLECOLUMN");
    

    add(..) 方法不再有效了。
    我不能保证名单上只包括 String aMethodToInitializeTheColumnList() 我的 代码。

    我犯了什么错?

    5 回复  |  直到 16 年前
        1
  •  28
  •   Community Mohan Dere    9 年前

    Michael's answer !

    Collection<?> c = new ArrayList<String>();
    c.add(new Object()); // Compile time error
    

    因为我们不知道元素是什么 反对它。add()方法需要 收藏的一部分。当实际的 类型参数为?,表示 某种未知类型。 要添加的pass必须是子类型 既然我们没有 里面有什么。唯一的例外是

        2
  •  18
  •   Michael Borgwardt    16 年前

    List<String> List<Object>

    有关通配符使用的更多信息,请参阅 Generics Tutorial

        3
  •  16
  •   Romain    16 年前

    如果你使用 <?> List<String> )或者是非常普通的 List<Object>

        4
  •  8
  •   Andrzej Doyle    16 年前

    在这种情况下,另一个选择是将您的列表声明为

    List<? super String>
    

    确切地 你所知道的。您说您不知道它的类型边界是什么,但是从第二行可以公平地假设它必须能够包含字符串。

    在我看来,这比一个 List<Object> 添加 get() Object ).

    实际上,这和 是后者允许的吗 tmpColumnList.add(3) tmpColumnList.add(new Thread()) 我更喜欢它所承载的语义和实用性。

        5
  •  2
  •   KLE rslite    16 年前

    这个 List<?> 表示列表已键入(或可能键入),但类型未知**。因此,如果您恰好是类型之外的人,则向其添加某些内容可能是错误的**。因为它是未知的,所以会警告你。

    List<Object> ,这意味着 可以包含任何类型的列表