Java 泛型子类型和通配符在Collections.copy中如何工作?

Java 泛型子类型和通配符在Collections.copy中如何工作?,java,generics,collections,Java,Generics,Collections,这是集合复制方法(它的一部分): 公共静态无效副本(列表< P>)让我们逐一考虑您的签名。< /P> 1. public static <T> void copy(List<T> dst, List<? extends T> src) 同样,对于隐式类型参数,T将被推断为Integer,因为您将List作为第二个参数传递给List。然后List是List的有效替代品,“但是您应该在这里使用第四个签名”为什么选择一个更复杂的签名,而一个更简单的签名也总是有效的

这是集合复制方法(它的一部分):


<代码>公共静态无效副本(列表< P>)让我们逐一考虑您的签名。< /P>
1. public static <T> void copy(List<T> dst, List<? extends T> src)

同样,对于隐式类型参数,
T
将被推断为
Integer
,因为您将
List
作为第二个参数传递给
List
。然后
List
List的有效替代品,“但是您应该在这里使用第四个签名”为什么选择一个更复杂的签名,而一个更简单的签名也总是有效的?@newacct。我已经解释过,其他替代方法不适用于显式类型参数。而且你不知道该方法是使用显式类型参数调用还是不使用显式类型参数调用。如果你有正确的显式类型参数,它确实适用于显式类型参数它是类型参数。如果您选择的显式类型参数对于该签名和参数是错误的,那么这不是签名的问题。@newacct。您的参数是完全有效的。但这也取决于该方法将要执行的操作。假设这一个是复制方法。一个列表是使用者,另一个是生产者,因此它是每个在这里使用下界和上界是完全可以接受的。
List<Object> objs = Arrays.<Object>asList(2, 3.14, "four");
List<Integer> ints = Arrays.asList(5, 6);

1. Collections.copy(objs, ints);
2. Collections.<Object>copy(objs, ints);
3. Collections.<Number>copy(objs, ints);
4. Collections.<Integer>copy(objs, ints);
1. public static <T> void copy(List<T> dst, List<T> src)
2. public static <T> void copy(List<T> dst, List<? extends T> src)
3. public static <T> void copy(List<? super T> dst, List<T> src)
4. public static <T> void copy(List<? super T> dst, List<? extends 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)