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 super T> c)
编辑:
@Louis Wasserman正确地指出我们只需要一个Comparator super T>
Comparator super T>
,而不是Comparator
。 由于Object
是任何T
的超类,因此Comparator
(默认情况下,如果没有给出通用参数)就足够了。
T
正在被解析为Object
。 这传递,因为Arrays.sort(T[], Comparator super T>)
将接受Comparator
,因为Object
是T
的超类型。
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 super T>)
的签名,所以你实际上提供了一个类型参数以您传入的数组类型的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 super T>
Comparator super T>
它匹配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
。