在Java中,Collections类包含以下方法:
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> c)
它的签名因其对泛型的高级使用而闻名, 以至于在《Java in a Nutshell》一书中提到过 并在官方 Sun Generics Tutorial .
但是,我找不到以下问题的令人信服的答案:
为什么形参类型是Collection<? extends T>
, 相当
比Collection<T>
?有什么额外好处?
最佳答案
类型推断是一个棘手的话题,我承认我对此了解不多。但是,请检查这个示例:
public class ScratchPad {
private static class A implements Comparable<A> {
public int compareTo(A o) { return 0; }
}
private static class B extends A {}
private static class C extends B {}
public static void main(String[] args)
{
Collection<C> coll = null;
B b = Scratchpad.<B>min(coll);
}
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> c) {
return null;
}
//public static <T extends Object & Comparable<? super T>> T min(Collection<T> c) {
// return null;
//}
}
考虑一下 min() 的第一个签名允许调用编译,而第二个签名则不允许。这不是一个非常实际的示例,因为人们必须问为什么我要将该方法显式键入 <B>
,但也许有一个隐含的推论,其中 B
将是推断的类型。
关于java - Collections.min/max方法的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367673/