JAVA中限定通配符如何理解?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Java中,限定通配符主要用于泛型(Generics)中,用来表示某种类型的不确定性,但同时对这种不确定性的类型加以约束。Java提供了两种限定通配符:? extends T
和 ? super T
。
? extends T
:上界通配符
T
的类型或者T
本身作为类型参数。T
或其子类的实例时,使用此通配符非常有用。因为它允许你将更具体的类型传递给方法,而方法内部只能执行读取操作(例如调用getter方法),不能添加元素到集合中,因为这可能会破坏集合的类型安全。Number
的对象列表,但不需要向列表中添加元素,你可以声明该方法的参数为List<? extends Number>
。? super T
:下界通配符
T
的父类或T
本身作为类型参数。T
或其父类的实例时,使用此通配符。它允许你在方法内部向集合添加元素,但限制了你从集合中获取元素的操作,因为编译器无法确定具体类型,只能安全地认为它们是T
的某个父类。Integer
对象的列表,无论这个列表是专门的Integer
列表还是它的父类如Number
的列表,你可以将参数声明为List<? super Integer>
。总结来说,限定通配符帮助我们在保持类型安全的同时,增加了泛型使用的灵活性,尤其是在处理具有泛型参数的集合时。上界通配符主要用于消费(读取)数据,而下界通配符则用于生产(写入)数据。