1-1.泛型的概述
泛型是一种未知的数据类型。
当我们不知道使用什么数据类型的时候,可以使用泛型。
泛型也可以被看作是一个变量,用来接收数据类型。
如:ArrayList集合在定义时,不知道集合中都会存储什么类型的数据,所以类型使用泛型,在创建集合对象时,就会确定泛型的数据类型,把数据类型作为参数传递赋值给泛型E。
1-2.使用泛型的好处
1).避免了类型转换的麻烦,存储的是什么类型,取出就是什么类型。
2).把运行期间的异常(代码运行之后会抛出异常)提前到了编译期(写代码时就会报错)。
使用泛型的弊端:在使用泛型后,泛型是什么类型,就只能存储什么类型的数据。
2-1.定义和使用含有泛型的类
可以定义一个含有泛型的类,模拟ArrayList类。
2-2.定义和使用含有泛型的方法
定义含有方法:泛型定义在方法的修饰符之后,在返回值类型之前。
格式:
修饰符 <泛型> 返回值类型 方法名称 (参数列表(使用泛型)){方法体;}
含有泛型的方法在调用方法的时候确定泛型的数据类型。
传递的是什么类型的参数,泛型就是什么类型。
2-3.定义和使用含有泛型的接口
含有泛型的类的第一种使用方式是定义接口的实现类,实现接口,指定接口的类型。
格式:
public interface Iterator<E>{E next();}
Scanner类实现了Iterator接口,并指定接口的泛型为String,并重写next方法。
public final class Scanner implements Iterator<String>{ }
含有泛型的接口的第二种使用方式:
接口使用什么泛型,实现类就使用什么泛型,类跟着接口走,就相当于定义了一个含有泛型的类,创建对象的时候确定泛型的类型。
格式:
public interface List<E>{boolean add(E e);
E get(int index);}
public class ArrayList<E> implements List<E> { boolean add(E e);}
即:
第一种方式是实现类确定泛型类型。
第二种方式是实例化确定泛型类型。
2-4.泛型的通配符
通配符:? 代表任意的数据类型。
不知道使用什么类型来接收时,此时可以使用,表示未知的通配符。
此时只能接收数据,不能往该集合中存储数据。
使用方式:
不能创建对象使用,只能作为方法的参数使用。
注意:泛型是没有继承概念的,ArrayList<String>集合是不能使用ArrayList<Object>集合接收。
定义集合是不能使用泛型通配符的。
泛型的上限限定:? extends E;代表使用的泛型只能是E类型的子类/本身。
泛型的下限限定:? extends E;代表使用的泛型只能是E类型的父类/本身。
类与类之间的关系:
Integer extends Number extends Object;
String extends Object.