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

Java泛型类型参数中的问号是什么意思?

  •  180
  • sholsapp  · 技术社区  · 15 年前

    这是一小段代码,取自斯坦福解析器附带的一些示例。我在爪哇发展了大约4年,但从未对这种风格的代码有什么很强的理解。

    List<? extends HasWord> wordList = toke.tokenize();
    

    我不担心代码的细节。我很困惑的是,在英语中,通用表达式到底应该表达什么。

    有人能给我解释一下吗?

    6 回复  |  直到 6 年前
        1
  •  198
  •   Powerlord    7 年前
    ? extends HasWord
    

    表示“扩展 HasWord “换句话说, HasWord 它自己或它的任何一个孩子…基本上,任何可以使用的 instanceof HasWord null .

    从技术角度来说, ? extends HasWord 是有界通配符,包含在第31项中 Effective Java 3rd Edition ,从第139页开始。第二版的同一章是 available online as a PDF ;关于有界通配符的部分是第134页开始的第28项。

    更新:PDF链接自Oracle不久前删除后更新。它现在指向伦敦玛丽皇后大学电子工程和计算机科学学院主办的副本。

    更新2:让我们更详细地讨论一下为什么要使用通配符。

    如果您声明的方法的签名希望您传入 List<HasWord> 那么你唯一能通过的就是 列表<hasword> .

    但是,如果上述签名是 List<? extends HasWord> 然后你可以通过 List<ChildOfHasWord> 相反。

    请注意,在 名单&?扩展hasword> List<? super HasWord> . 正如JoshuaBloch所说:pecs=生产者扩展,消费者超级。

    这意味着,如果传递的集合是您的方法从中提取数据(即,集合正在生成供您的方法使用的元素),则应使用 extends . 如果要传入一个方法向其添加数据的集合(即集合正在使用方法创建的元素),则应该使用 super .

    这听起来可能令人困惑。不过,你可以在 List sort 命令(这只是collections.sort的两个参数版本的快捷方式)。而不是采取 Comparator<T> ,实际上需要 Comparator<? super T> . 在这种情况下,比较器使用 以便重新排序列表本身。

        2
  •  52
  •   Jherico    15 年前

    问号是“任何类型”的符号。 ? 单独手段

    任何类型扩展 Object (包括) 对象 )

    上面的例子意味着

    任何类型的扩展或实现 HasWord (包括) HasWord 如果 HasWord 是非抽象类)

        3
  •  12
  •   deadboy    10 年前

    List<? extends HasWord> 接受扩展hasword的任何具体类。如果你有下列课程…

    public class A extends HasWord { .. }
    public class B extends HasWord { .. }
    public class C { .. }
    public class D extends SomeOtherWord { .. }
    

    …这个 wordList 只能包含as或bs或两者的混合列表,因为这两个类扩展同一父类或 null (检查失败) HasWorld )

        4
  •  9
  •   Tom Hawtin - tackline    6 年前

    也许一个人为的“现实世界”的例子会有所帮助。

    在工作中,我们有不同口味的垃圾桶。所有的垃圾箱都有垃圾,但有些垃圾箱是专业的,不接受所有类型的垃圾。所以我们有 Bin<CupRubbish> Bin<RecylcableRubbsih> . 类型系统需要确保我不能 HalfEatenSandwichRubbish 这两种类型中的任何一种,但它可以进入一般的垃圾箱 . If I wanted to talk about a 箱子 of 垃圾 which may be a specialist so I can't put in incompatible rubbish, then that would be 宾'.

    (注: ? extends 不表示只读。例如,我可以采取适当的预防措施,从一个不知名的专业垃圾桶中取出一块垃圾,然后放回另一个地方。)

    不知道这有多大帮助。存在多态性时指向指针的指针并不完全明显。

        5
  •  4
  •   jjnguy Julien Chastang    13 年前

    英语:

    这是一个 List 扩展类的类型 HasWord 包括 HasWord

    一般来说 ? 在泛型中,表示任何类。以及 extends SomeClass 指定该对象必须扩展 SomeClass (或者是那种人)。

        6
  •  1
  •   leo9r    11 年前

    问号用于定义 通配符 . 查看有关它们的Oracle文档: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html