在新变量声明中覆盖方法

overriding methods inside a new variable declaration

在处理一个项目时,我遇到了以下代码段,它似乎提供了代码,完全包含在一个新的变量声明中,它似乎覆盖了一个方法。我以前遇到过这种形式的代码,但不可否认,我并不完全理解它。如果有人能解释此代码所基于的编程机制,我将非常感激。特别是,何时允许在变量声明中使用此类重写方法。还有哪些其他类型的数据结构允许这种行为?什么时候编写这种性质的代码比较有利?为什么不覆盖变量声明之外的方法?

tempRequests.sort(new Comparator<Integer>() 
{           
    @Override

    public int compare(Integer integer1, Integer integer2) 
    {           
        return integer1.compareTo(integer2);        
    }


});

还有哪些其他类型的数据结构允许这种行为?

-> 您可以通过实现接口 Comparable 对对象进行排序。 例如:

 public class Car implements Comparable<Car> {
     private String name;
     @Override
     public int compareTo(Car b) {
     return name.compareTo(b.name);
      }
    }

->您也可以在内部 class.

中使用没有覆盖方法比较的比较器
public class Car implements Comparator<Car> {
     private String name;
     private double price;
     @Override
     public int compare(Car b1, Car b2) {
     return b1.price - b2.price;
      }
    }

什么时候编写这种性质的代码比较有利?为什么不覆盖变量声明之外的方法?

-> Image that after using sort object Car by name, you want to sort by something something (like by price, by weight). 当你想在不同时间以不同方式对对象进行排序时,如何执行此操作?我们在内部 class 中使用带有定义的比较器来执行此操作。

*此外,Comparator 是一个功能接口,因为它是唯一要实现的抽象方法。您可以在一行代码中使用时髦的语法重写: 例如:

Compareator<Car> byPrice = (b1,b2) -> b1.price - b2.price;

这个机制在评论里已经解释的很好了。 顺便说一句:自从 Java 8 以来,匿名 类 的这种用法被认为有些过时,因为它可以用简单的 Lambda 表达式代替:

tempRequests.sort((l, r) -> l.compareTo(r));        

这适用于所有 "Functional Interfaces",它被定义为具有恰好一个非静态和非默认方法的接口。