泛型中 super T 和 extends T 的区别有哪些

小编 791

泛型中super T 和extends T 的区别有:1.含义不同;2.使用不用;3.适用性不同。含义不同是两者最基本也是最根本的区别,super T 限定参数类型的下界,泛型参数必须是T或T的超类型;而extends T 限定参数类型的上界,泛型参数必须是T或T的子类型。

1.含义不同

super T是指下界通配符(Lower Bounds Wildcards), 即具体的泛型参数需要满足条件,泛型参数必须是T类型或者他的父类;而extends T是指上界通配符(Upper Bounds Wildcards),即具体的泛型参数需要满足条件, 泛型参数必须是T类型或他的子类。

2.使用不用

消费者使用super:如果需要一个列表使用T类型的元素(即你想把T类型的元素加入到列表中),你需要把这个列表声明成<? super T>,比如List<? super Integer>,因此你不能保证从中读取到的元素的类型。

生产者使用extends:如果你需要一个列表提供T类型的元素(即你想从列表中读取T类型的元素),你需要把这个列表声明成<? extends T>,比如List<? extends Integer>,因此你不能往该列表中添加任何元素。

3.适用性不同

下界<? super T>不影响往里存,但往外取只能放在Object对象里;而上界<? extends T>不能往里存,只能往外取。因此,经常往里插入的,适合用下界Super;频繁往外读取内容的,适合用上界Extends。

延伸阅读

java中泛型使用的注意事项

Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

使用泛型时的注意事项有:

  • 在定义一个泛型类时,在“<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K”,“V”不代表值,而是表示类型;
  • 实例化泛型对象时,一定要在类名后面指定类型参数的值(类型),一共要有两次书写;
  • 使用泛型时,泛型类型必须为引用数据类型,不能为基本数据类型,Java中的普通方法,构造方法,静态方法中都可以使用泛型,方法使用泛型之前必须先对泛型进行声明,可以使用任意字母,一般都要大写;
  • 不可以定义泛型数组;
  • 且在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰;
  • 根据同一个泛型类衍生出来的多个类之间没有任何关系,不可以互相赋值;
  • 泛型只在编译器有效。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部