类型推断是一个棘手的话题,我承认我对此知之甚少。但是,请检查此示例:
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