首页 / JAVA / 在Java中,泛型是不变的?
在Java中,泛型是不变的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中,泛型是不变的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1160字,纯文字阅读大概需要2分钟。
内容图文
![在Java中,泛型是不变的?](/upload/InfoBanner/zyjiaocheng/704/1df62217bda04a3dafeea704ce4ee4c5.jpg)
编译以下代码失败:
public static void swap(List<?> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
喜欢:
Swap.java:5: set(int,capture#282 of ?) in List<capture#282 of ?> cannot be applied to (int,Object)
list.set(i, list.set(j, list.get(i)));
但如果我这样做:
public static void swap(List<?> list, int i, int j) {
swapHelper(list, i, j);
}
private static <E> void swapHelper(List<E> list, int i, int j) { list.set(i, list.set(j, list.get(i)));
}
它的工作完美.
但我在这里有一个基本的疑问.泛型被认为是不变的,因此List< String>不是List< Object>的子类型,对吧?
如果是这种情况,那么如何通过上述方法,我们能够传递List<?>列出< E>?这是怎么回事?
解决方法:
答案是通配符.
列表与LT;?>与List< Object>不同
虽然java假设两者都是Object的集合,但前者将匹配任何其他List< T>的类型,而后者将不匹配任何List< T>的类型.除了List< Object>.
例:
public void doSomething(List<Object> list);
此功能仅接受List< Object>作为它的参数.不过这个:
public void doSomething(List<?> list);
将接受任何列表< T>作为它的参数.
当与generic constraints一起使用时,这非常有用.例如,如果您想编写一个操作数字的函数(整数,浮点数等),您可以:
public void doSomethingToNumbers(List<? extends Number> numbers) { ... }
内容总结
以上是互联网集市为您收集整理的在Java中,泛型是不变的?全部内容,希望文章能够帮你解决在Java中,泛型是不变的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。