java – 通用子类型和通配符如何在Collections.copy中工作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 通用子类型和通配符如何在Collections.copy中工作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2565字,纯文字阅读大概需要4分钟。
内容图文
这是Collections复制方法(部分):
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
}
有4个样本电话:
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)
对于上面的示例调用,
>其中第一个限制性太强,因为它只允许呼叫
目的地和来源具有完全相同的类型. (明白了).
>第二个签名仅在类型参数为Object时有效
>第三个签名仅在类型参数为Integer时有效
>最后一个签名适用于所有三种类型参数 – 即Object,
数字和整数.
请解释第二,第三和最后一个签名?
The remaining three are equivalent for calls that use
implicit type parameters, but differ for explicit type parameters.
以上陈述的含义是什么?
解决方法:
让我们逐一考虑你的每一个签名.
1. public static <T> void copy(List<T> dst, List<? extends T> src)
如果在没有显式类型参数的情况下调用此方法,则类型参数将被推断为Object,因为您传递List< Object>作为第一个论点.然后列出<? extends Object>可以接受整数.
但是,如果使用显式类型参数Number调用,尽管可以传递List< Integer>列出<?扩展数字>,对于List< Object>同样不是这样.和列出< Number>,因为泛型是不变的.
2. public static <T> void copy(List<? super T> dst, List<T> src)
同样对于隐式类型参数,T将被推断为整数,因为您传递List< Integer>作为List< T>的第二个参数.然后List< Object>是List< ;?的有效替代品超级整数>.
如果使用显式类型参数Number调用方法,则可以传递List< Object>作为第一个参数,但你不能传递List< Integer>作为第二个论点.出于与上述相同的原因.
3. public static <T> void copy(List<? super T> dst, List<? extends T> src)
现在,此方法签名适用于任何类型.对于推断的任何类型参数,dst是T实例的使用者,而src是T实例的生产者.例如,如果使用显式类型参数Number调用,则List< Object>捕获可转换为List<? super>,类似地,List< Integer>捕获可转换为List<?扩展数字>.所以,两个参数都是有效的替换.
因此,在所有3种情况下,如果您没有明确提供类型参数,编译器可以正确推断类型参数.但你应该在这里使用第4个签名,原因是 –
> dst是T实例的使用者,所以它应该使用下限,并且
> src是T实例的生成者,因此它应该使用上限.
相关文章:
> What is PECS (Producer Extends Consumer Super)?
参考:
> JLS – Capture Conversion
> Java Generics FAQs – What is a bounded wildcard?
内容总结
以上是互联网集市为您收集整理的java – 通用子类型和通配符如何在Collections.copy中工作?全部内容,希望文章能够帮你解决java – 通用子类型和通配符如何在Collections.copy中工作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。