(如果这是重复的,请给我指出正确的答案!我搜索并阅读了几个(
显然,当集合类使用比较器时,它应该具有类型<代码>比较器,这是正确的做法
我的问题是使用Comparator.naturalorder()
,它是在T扩展可比上参数化的
我不能让它工作。我的问题,所有相关的,是:
如何正确使用Comparator.naturalorder
?
- 我可以做我想要的,即有一个存储用户提供的比较器或
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>
所以如果我决定放弃的优势?超级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>
我想你必须在你的示例中的Foo类中实现可比较才能使用Comparator.naturalorder()。你必须有一个方法compareTo(Object o),这个方法是实现自然顺序的方法,所以你不需要把它存储在变量中。
我认为您可以在一个类中使用比较器,该类至少在Java 8中没有实现可比较的接口,因此它们没有实现compareTo(对象o),但您必须实现这一点
@FunctionalInterface
public interface Comparator<T>
这来自Java8 API
一种比较函数,它对某些对象集合施加总排序。比较器可以传递给排序方法(如Collections.sort或Arrays.sort),以允许精确控制排序顺序。比较器还可用于控制某些数据结构(如排序集或排序映射)的顺序,或为没有自然顺序的对象集合提供排序。
实施和初始化的方法:
private Comparator<Operario> ComparatorOperario =
(o, p)-> o.getNombre().compareTo(p.getNombre());
然后可以为该变量设置getter和setter,以便更改排序方式
请注意,类operario
不实现可比较
,它使用比较器
这将编译:
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与比较器接口一起使用,这对它施加了某些要求(特别是它有一个奇特的递归要求,即T必须实现可比较的接口)。在泛化(?)时,您不会强加此类要求你的类,所以编译器不高兴。您对T的要求必须与您所使用的类一样强烈。
您对自然排序方法的作用感到困惑。它只需要一个实现Comparable的类,并为其创建默认的Comparator。没有办法解决这个问题——你不能为不可比较的东西创建一个比较器。
您希望TreeMap需要Compariable,但您不能,因为只要提供了Compariator,就可以使用不可比较的内容。所以TreeMap最终没有强制可比性,只是在运行时显式强制转换(并引发异常)。
我正在使用Java和Scala的twirl模板。所以我试图在模板中对列表进行排序,但我不知道如何覆盖比较器方法。 My List包含类的对象,设计如下: BaseFoo类确实有一个名为 在我的scala旋转模板中,它看起来像: 否在twirl模板中,我正在尝试对其进行排序: 但这似乎无法编译: 需要类类型,但java.util.ArrayList[_
本文向大家介绍Objective-C语言日期比较,包括了Objective-C语言日期比较的使用技巧和注意事项,需要的朋友参考一下 示例 NSDate在Objective-C中有4种比较s的方法: - (BOOL)isEqualToDate:(NSDate *)anotherDate - (NSDate *)earlierDate:(NSDate *)anotherDate - (NSDate *
我不知道为什么我的代码给我一个空java.util.date. 问题:编写一个测试程序,创建一个帐户ID为1122,余额为20000,年利率为4.5%的帐户对象。使用提款方式提取2500美元,使用存款方式存入3000美元,并打印余额,每月利息,以及创建此帐户的日期 这是我的代码: }
我正在我的类Employee中实现Comparator和Comparable来排序ArrayList。我在2个参数名称和ID排序。当使用collections.sort(Employee ob1,Employee ob2)进行ID排序时,它不起作用。我得到一个编译错误,即类没有声明为弃权,也没有重写compare(),尽管我是这样做的: 如果我使用 我的疑问是,既然员工也是一个对象,为什么早先的不
本文向大家介绍Go语言interface 与 nil 的比较,包括了Go语言interface 与 nil 的比较的使用技巧和注意事项,需要的朋友参考一下 interface简介 Go语言以简单易上手而著称,它的语法非常简单,熟悉C++,Java的开发者只需要很短的时间就可以掌握Go语言的基本用法。 interface是Go语言里所提供的非常重要的特性。一个interface里可以定义一个或者多个
问题内容: 我需要一个TreeMap的比较器。我应该在TreeMap的构造函数中匿名编写此代码吗?我还能怎么写我的比较器。目前,Java不喜欢我的代码(我可以匿名这样做吗?): 我可以匿名进行上述操作吗? 我还能怎么做? 我想按值而不是键对myMap进行排序 问题答案: 您无法根据值对TreeMap进行排序。 基于红黑树的NavigableMap实现。映射是根据其键的自然顺序或在映射创建时提供的C