概念:
泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候可以使用泛型;
泛型也可以看出是一个变量,用来接收数据类型
泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
一、自定义和使用含有泛型的类
注意:泛型定义在类后
格式:
public class 类名<T> {}
使用方式:
直接new创建对象的时候确定泛型的数据类型;不写泛型则是Object类型,
例子:ArrayList<Object> arrayList = new ArrayList<>();
注意:如若想要使用String类的方法则要向下转型;使用泛型的类这不需要向下转型
二、自定义和使用含有泛型的方法
注意:泛型定义在方法的修饰符和返回值之间
格式:
public <T> void method(T t){方法体}
使用方式:
含有泛型的方法,在调用方法的时候确定泛型的数据类型,
传递什么类型的参数,泛型就是什么类型
例子:
三、自定义和使用含有泛型的接口
注意:泛型定义在接口后
格式:
public interface 接口名<T> {}
1.第一种使用方式:
步骤一.定义接口的实现类,
步骤二.指定接口的泛型,
例子:Scanner类实现了Iterator泛型接口后并指定泛型为String;
2.第二种使用方式:
步骤一.接口使用什么泛型,
步骤二.实现类就使用什么泛型,类跟着接口走;
例子:创建ArrayList对象并指定泛型为String;
注意:就相当于定义了一个含有泛型的类,创建对象的时候确定泛型的类型;
泛型通配符
类型通配符一般是使用?代替具体的类型参数;
如:List<?>,在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的父类。
注意:
1.一旦使用了泛型通配符!只能使用Object类中的共性方法,集合中元素自身方法无法使用。
2.泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
3.泛型没有继承概念
普通使用:
1.在创建对象的时候不能用泛型通配符,只能在传参的时候使用泛型通配符
高级使用(受限泛型):
泛型的上限限定: ? extends E 代表使用的泛型只能是E类型的子类/本身
泛型的下限限定: ? super E 代表使用的泛型只能是E类型的父类/本身
创建集合对象,使用泛型好处:
1,避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2,把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)
比如object类型在向下转型String时,若存在int数据则会报错
创建集合对象,使用泛型弊端:
1.泛型是什么类型,只能存储什么类型的数据;