当前位置: 首页 > 知识库问答 >
问题:

Java接口/比较器

唐默
2023-03-14

我是java新手,试图理解一些概念。这是一段我不懂的代码。

public static Comparator<Fruit> FruitNameComparator = new Comparator<Fruit>() 
{
    public int compare(Fruit fruit1, Fruit fruit2) 
    {
        return fruit1.quantity - fruit2.quantity;
    }
};

我知道这是怎么回事,但不明白为什么这是允许的。因此,我的问题是:

  1. 从java文档中,比较器[T]是一个接口。比较器[水果]怎么样?我将假设它是一个类,因为它必须覆盖比较函数。
  2. 为什么可以在{}中使用非参数构造函数和类定义来初始化FruitName比较器?我在比较器[T]的javadoc中没有找到这样的构造函数声明。

如有任何意见,将不胜感激。

共有2个答案

韦正业
2023-03-14

它是一个匿名类,是一个类型(超级类或接口)的在线具体实现。

提供了由类型声明的任何抽象方法的实现。

在超级类的情况下,不能指定调用的构造函数,因此如果没有默认/无参数构造函数,则必须提供参数。

在接口的情况下,构造函数中不能指定参数,因为接口不能声明构造函数。

顺便说一句,我倾向于将您的字段命名为fruitQuantityComparator,而不是fruitNameComparator,因为它比较的是数量,而不是名称。

太叔志文
2023-03-14

这段代码使用的是Java的一个称为匿名内部类的特性。指定要实现/扩展的接口或超类以及匿名类主体。您的匿名内部类实现了Comparator

 类似资料:
  • 我有一个关于比较器接口的问题。在我的类下面实现了按长度而不是按字符值排序的默认排序的接口。 覆盖默认比较后,我使用对我的字符串数组进行排序。即使我覆盖了默认方法,如果我使用Arrays.sort,它会调用默认比较而不是我覆盖的方法。这是因为我显式调用了超类方法吗? 另一个问题是初始化接口本身。我知道您不能初始化接口,而是初始化一个类对象(实现所述接口)来引用接口可用的方法。在这种情况下,当我初始化

  • 当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。

  • 本文向大家介绍对比Java中的Comparable排序接口和Comparator比较器接口,包括了对比Java中的Comparable排序接口和Comparator比较器接口的使用技巧和注意事项,需要的朋友参考一下 Comparable Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在

  • 问题内容: 假设我有一对班 我希望先按第一个值排序,然后再按第二个值排序。现在,如果我这样做 一切正常,列表按对的第一个值排序,但是如果我这样做 它因错误而失败 好的,所以它可能无法推断参数,所以如果我这样做 它因错误而失败 为什么它对compare()而不是compare()。thenComparing()有效? 问题答案: 该错误似乎与的通用参数有关。一种解决方法是尝试使用显式类型: 请注意,

  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜

  • 问题内容: 我有两个对象。是类型。类型是隐藏对象的接口。定义为: 它还有一些额外的方法。但是,由于该类“未导出”,所以我无法将任何一个键都转换为一个,因为那没有实现,所以我也无法转换为一个,并且我无法访问the 或from,因为我不应该知道我有一个对象。 我应该怎么比较,并且是相同的密钥? 问题答案: 如前所述,您不能使用类型断言,因为您不能引用未导出的type 。 使用软件包可以实现您想要的一切