gpt4 book ai didi

java.util.Comparator.naturalOrder 采用 > 并返回一个 Comparator - 为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:41 29 4
gpt4 key购买 nike

(如果这是重复的,请指出正确的答案!我搜索并阅读了几个(> 5)个相关问题,但似乎没有一个是正确的。还查看了泛型常见问题解答和其他来源...)

当一个集合类接受一个比较器时,它应该具有 Comparator<? super T> 类型显然是正确的做法。对于您的参数化类型 T .你可以看到很多地方,例如 TreeMap .好的。

我的问题是使用 Comparator.naturalOrder() T extends Comparable<? super T> 上参数化但返回 Comparator<T> .我试图在我的集合类中有一个字段,它包含用户指定的比较器或 Comparator.naturalOrder比较器。

我无法让它工作。我的所有相关问题是:

  1. 怎么样Comparator.naturalOrder正确使用?
    • 我可以做我想做的事情吗?我可以在其中存储用户提供的比较器或 naturalOrder 的字段。比较器?
  2. 鉴于大多数集合类(在框架中)在 T 上被参数化不是 T implements Comparable<? super T> ,这就是选择的设计模式,naturalOrder如何?有用,因为它需要后者有界通配符,而不是不受约束的类型参数?

谢谢!

下面是带有编译器错误的实际示例:

所以:如果我在某个 T 没有边界的类中有这样的代码(就像在所有现有的集合类中一样):

class Foo<T> {

private Comparator<? super T> comparator;

public void someMethod(Comparator<? super T> comparator)
{
this.comparator = comparator; // no compile error
this.comparator = Comparator.naturalOrder(); // incompatible types
}
}

出现此错误:

Error:(331, 50) java: incompatible types: inferred type does not conform to upper bound(s)
inferred: T
upper bound(s): java.lang.Comparable<? super T>

所以如果我决定放弃 ? super T 的优势然后我有:

class Foo<T> {

private Comparator<T> comparator;

public void someMethod(ComparatorT> comparator)
{
this.comparator = comparator; // no compile error
this.comparator = Comparator.naturalOrder(); // incompatible types
}
}

我在哪里

Error:(nnn, 50) java: incompatible types: inference variable T has incompatible bounds
equality constraints: T
upper bounds: java.lang.Comparable<? super T>

最佳答案

编译:

import java.util.*;

class Foo<T extends Comparable<? super T>> {

private Comparator<T> comparator;

public void someMethod(Comparator<T> comparator)
{
this.comparator = comparator; // no compile error
this.comparator = Comparator.<T>naturalOrder(); // <T> is optional, compiler can infer
}
}

最简单的思考方式是:您正在尝试将类型 T 与 Comparator 接口(interface)一起使用,这对它施加了某些要求(特别是它具有奇特的递归要求,即 T 必须实现 Comparable 接口(interface))。在泛型化(?)你的类时你没有强加这样的要求,所以编译器不高兴。您对 T 的要求必须与您使用它的类一样强烈。

您对自然排序方法的作用感到困惑。它只需要一个实现 Comparable 的类并为其创建默认的 Comparator 。没有办法绕过它——您不能为不可比较的东西创建比较器。

您希望 TreeMap 需要 Comparable,但您不能这样做,因为只要您提供了 Comparator,就可以使用不可比较的对象。所以 TreeMap 最终不强制执行 Comparable,只是在运行时显式转换(并抛出异常)。

关于java.util.Comparator.naturalOrder 采用 <T extends Comparable<? super T>> 并返回一个 Comparator<T> - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24565278/

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