gpt4 book ai didi

java - 泛型方法和通配符

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:14:50 24 4
gpt4 key购买 nike

下面三种签名有什么区别?

static <T> void foo(List<T>,           Comparator<? super T>);
static <T> void bar(List<? extends T>, Comparator<T> );
static <T> void baz(List<? extends T>, Comparator<? super T>);

我知道 extendssuper 在泛型中的含义。我的问题是 foobarbaz 之间是否有区别。我应该使其中一个参数不变而另一个在适当的方向上变体,还是应该使它们都变体?有区别吗?

最佳答案

PECS - 生产者扩展,消费者 super 。

解释这个“规则”:

  • extends表示泛化对象产生该类型的元素。当是集合时,表示只能从集合中取出元素,不能放入。比较器
  • super表示该对象使用所选类型的对象。因此您可以添加到集合中,但不能从中读取。
  • 缺少 extends 和 super 意味着您可以为指定的确切类型同时执行这两项操作。

关于 Comparator ,我认为这没有任何区别。通常,它将是 <? super T>因为您比较器使用对象,但在所有三种情况下您都可以安全地调用 Collections.sort(list, comparator); (签名为<? super T>)

关于java - 泛型方法和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754415/

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