Java 显式类型参数

Java 显式类型参数,java,generics,Java,Generics,阅读Java泛型和集合book //given public static <T> void copy(List<? super T> dst, List<? extends T> src) { .... } 第一个限制太严格,因为它只允许在目标和源具有完全相同的类型(已理解)时调用 其余三个对于使用隐式类型参数的调用是等效的(已理解-类型推断算法将推断适当的类型) 混淆部分- 但显式类型参数不同。 对于上面的示例调用,第二个签名仅在类型参数为Objec

阅读
Java泛型和集合
book

//given
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
  ....
}
第一个限制太严格,因为它只允许在目标和源具有完全相同的类型(
已理解
)时调用

其余三个对于使用隐式类型参数的调用是等效的(
已理解
-类型推断算法将推断适当的类型)

混淆部分-
但显式类型参数不同。 对于上面的示例调用,第二个签名仅在类型参数为
Object
时有效,第三个签名仅在类型参数为
Integer
时有效

我很困惑,因为我尝试了(如下)


在案例5中,形式参数是
List
List,我也这么认为,但我不明白的是,只有当类型参数是作者在
混淆部分提到的案例
2
中的Object
时,第二个签名才有效。上面的“示例调用”是什么在案例2中引用?确定。我现在明白了。作者的意思是,从所示的调用中,情况2只适用于指定的显式类型为
Object
的调用。对的
public static <T> void copy(List<T> dst, List<T> src)                    1
public static <T> void copy(List<T> dst, List<? extends T> src)          2  
public static <T> void copy(List<? super T> dst, List<T> src)            3
public static <T> void copy(List<? super T> dst, List<? extends T> src)  4
public class AsList {
    public static void main (String...a) {
        List<Number> l4 = new ArrayList<Number>();
        List<Object> l5 = new ArrayList<Object>();
        List<Integer> l6 = new ArrayList<Integer>();

        //type is inferred implicitly for the below call
        copy(l4, Arrays.<Integer>asList(1, 2, 3));

        //type is specified explicitly
        AsList.<Number>copy(l4, Arrays.<Integer>asList(1, 2, 3));   \\why?  5
        AsList.<Object>copy(l5, Arrays.<Integer>asList(1, 2, 3));           6
        AsList.<Integer>copy(l6, Arrays.<Integer>asList(1, 2, 3));  \\why?  7
    }
    public static <T> void copy(List<T> dst, List<? extends T> src) {
        for (int i = 0; i < src.size(); i++) {
            dst.add(src.get(i));
        }
    }
}
Collections.copy(objs, ints);
Collections.<Object>copy(objs, ints);
Collections.<Number>copy(objs, ints);
Collections.<Integer>copy(objs, ints);