Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口/比较器_Java - Fatal编程技术网

Java接口/比较器

Java接口/比较器,java,Java,我是java新手,试图理解一些概念。这是一段我不懂的代码 public static Comparator<Fruit> FruitNameComparator = new Comparator<Fruit>() { public int compare(Fruit fruit1, Fruit fruit2) { return fruit1.quantity - fruit2.quantity; } }; publicstat

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

public static Comparator<Fruit> FruitNameComparator = new Comparator<Fruit>() 
{
    public int compare(Fruit fruit1, Fruit fruit2) 
    {
        return fruit1.quantity - fruit2.quantity;
    }
};
publicstaticcomparator-fructnameparator=newcomparator()
{
公共int比较(水果水果1、水果水果2)
{
返回结果1.数量-结果2.数量;
}
};
我知道这是怎么回事,但不明白为什么这是允许的。因此,我的问题是:

  • 在java文档中,比较器[T]是一个接口。比较仪[水果]怎么样?我假设它是一个类,因为它必须重写compare函数
  • 为什么可以在{}中使用非参数构造函数和类定义初始化FructureNameComparator?我在Comparator[t]的javadoc中没有找到这样的构造函数声明

  • 任何输入都将不胜感激。

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

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

    为类型声明的任何抽象方法提供实现

    对于超类,不能指定调用的构造函数,因此如果没有默认的/no-args构造函数,则必须提供参数

    对于接口,构造函数中不能指定任何参数,因为接口不能声明构造函数



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

    +1实际上,如果你把它放在一个名为
    MyClass
    的类中并编译它,你会看到一个类似
    MyClass$1.class
    的文件。这是此匿名类的类文件。将其读取为…=新的(实现的类)Comparator()谢谢。在阅读了我们的评论并思考之后,我理解了为什么该准则是合法的。正是我要找的。