泛型
概述:泛型是一种未知的数据类型,在创建对象时确定类型。例如E e:Element 元素
和T t:Type类型
,也可以看作一个数据变量,用来接收数据类型。
创建集合对象时使用泛型
通过对元素类型的约束可以规避掉后面类型转换的麻烦,若没有泛型约束,则默认为Object对象,可以存放任意类型的数据,由于多态的弊端无法调用该元素类型特有的方法,需向下转型且可能会引发异常。
定义含有泛型的类
只需在类名后跟上<E>
,将类型不确定的成员变量类型也改为<E>
,则其默认类型就为Object。在创建对象时声明需要的类型即可。
定义含有泛型的方法
格式:
修饰符 <泛型> 返回值类型 方法名(参数列表){ //在修饰符后面定义泛型,在参数列表中使用泛型
方法体;
}
使用:在调用方法时,传递什么类型的参数,就确定了泛型的类型。
定义含有泛型的接口
-
使用方式一
接口使用泛型,实现类也跟着接口走使用泛型。相当于定义了含有泛型的类,创建对象时再确定类型。
-
使用方式二
定义接口的实现类并指定接口类型,创建对象时只能使用此类型。
泛型通配符
概述:当要接收的元素的数据类型未知时,可以用<?>
来接收,不需要在修饰符后定义,但不可用未知通配符往集合中储存数据。泛型只能作为方法的参数使用,而不能在new对象时使用。
注意:泛型中没有继承的概念。迭代器的next方法取出的元素类型是Object,因此可接受任意类型数据。
通配符高级使用(受限泛型)
-
上限:只能接收该E类型及其子类
类名<? extends E类>对象名
-
下限:只能接收该E类型及其父类
类名<? super E类>对象名