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