Collections.reverseOrder如何知道返回Comparator 时要使用的类型参数

根据Java API规范,Collections.reverseOrder的签名是

public static Comparator reverseOrder()

方法描述中给出的示例表明它需要用作

Arrays.sort(a, Collections.reverseOrder());

当我们调用该方法时,我们无处指定要使用的类型(T解析为什么)。

在这种情况下,编译器如何解析T? 可以根据分配给它的对象的类型来解析返回类型(T)吗?

顺便说一句,我知道重载的reverseOrder(Comparator c)方法。

Arrays.sort()知道它需要什么样的Comparator,因为T是由第一个参数( a )指定的:

 public static  void sort(T[] a, Comparator c) 

编辑:

@Louis Wasserman正确地指出我们只需要一个Comparator Comparator ,而不是Comparator 。 由于Object是任何T的超类,因此Comparator (默认情况下,如果没有给出通用参数)就足够了。

T正在被解析为Object 。 这传递,因为Arrays.sort(T[], Comparator)将接受Comparator ,因为ObjectT的超类型。

Eclipse确认Collections.reverseOrder()已解析为代码中的Comparator

 String[] array = new String[10]; Arrays.sort(array, Collections.reverseOrder()); 

T根据a的类型解决。

可以推断出方法调用中的类型。

 Xyz[] a; Arrays.sort(a, Collections.reverseOrder()); 

相当于

 Xyz[] a; Arrays.sort(a, Collections.reverseOrder()); 

从Java SE 7开始,类似于构造函数的工作,只需要使用“钻石’运算符’”(原因不是很充分)。

 List xyzs = new ArrayList<>(); 

如果你查看Arrays.sort()的签名,你会看到你正在调用的签名有Arrays.sort(T[], Comparator)的签名,所以你实际上提供了一个类型参数以您传入的数组类型的forms。

编辑:我在这里犯了一个小错误,并假设对reverseOrder()的调用可以推断出类型,但没有至少一个参数,没有方法可以实际做到这一点(参见链接)。

如果对Collections.reverseOrder()的调用采用了参数,则该方法可以从调用中推断出类型。 该方法的重载版本将Comparator作为参数。 我们可以用以下内容演示Eclipse中的推理; 将鼠标hover在Collections.reverseOrder()

public class CollectionsFun { public static void main(String[] args) { String[] strs = new String[] {"foo", "bar", "baz"}; Comparator comp = new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }; Arrays.sort(strs, Collections.reverseOrder(comp)); System.out.println(strs); } }
public class CollectionsFun { public static void main(String[] args) { String[] strs = new String[] {"foo", "bar", "baz"}; Comparator comp = new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }; Arrays.sort(strs, Collections.reverseOrder(comp)); System.out.println(strs); } } 

因为在此示例中对reverseOrder()的调用采用了类型化参数,所以静态方法可以推断出需要返回的类型。 但是,当您调用不带参数的方法的重载forms时,不能推断出任何类型,因此您将返回Comparator而不是Comparator 。 您可以通过将reverseOrder()hover在下面的代码中的reverseOrder()调用reverseOrder()看到:

public class CollectionsFun { public static void main(String[] args) { String[] strs = new String[] {"foo", "bar", "baz"}; Arrays.sort(strs, Collections.reverseOrder()); System.out.println(strs); } }
public class CollectionsFun { public static void main(String[] args) { String[] strs = new String[] {"foo", "bar", "baz"}; Arrays.sort(strs, Collections.reverseOrder()); System.out.println(strs); } } 

由于Arrays.sort()的签名表明它需要一个Comparator Comparator它匹配Comparator 。 所以这一切都编译而不会在任何地方给你一个“原始类型”警告。

最后,如果您想要展示如何在没有类型推断的情况下工作,您将执行以下操作:

public class CollectionsFun { public static void main(String[] args) { String[] strs = new String[] {"foo", "bar", "baz"}; Arrays.sort(strs, Collections.reverseOrder()); System.out.println(strs); } }
public class CollectionsFun { public static void main(String[] args) { String[] strs = new String[] {"foo", "bar", "baz"}; Arrays.sort(strs, Collections.reverseOrder()); System.out.println(strs); } } 

上面提供的type参数确保返回的Comparator的类型是Comparator