泛型
泛型:可以在类或方法中预支地使用未知的类型。
一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
使用泛型的好处
<1>将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
<2>避免了类型强转的麻烦。
泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
泛型的定义与使用
我们在集合中会大量使用到泛型,这里来完整地学习泛型知识。
泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
定义和使用含有泛型的类
定义格式:
修饰符 class 类名 { }
例如,API中的ArrayList集合:
泛型在定义的时候不具体,使用的时候才变得具体。在使用的时候确定泛型的具体数据类型。
class ArrayList{
public boolean add(E e){ }
public E get(int index){ }
....
}
使用泛型: 即什么时候确定泛型。
在创建对象的时候确定泛型
例如, ArrayList<string> list = new ArrayList<string>();/<string>/<string>
此时,变量E的值就是String类型,那么我们的类型就可以理解为:
class ArrayList<string>{
public boolean add(String e){ }
public String get(int index){ }
...
}
/<string>
再例如, ArrayList<integer> list = new ArrayList<integer>();/<integer>/<integer>
此时,变量E的值就是Integer类型,那么我们的类型就可以理解为:
class ArrayList<integer> {
public boolean add(Integer e) { }
public Integer get(int index) { }
...
}
/<integer>
含有泛型的方法
定义格式:
修饰符 返回值类型 方法名(参数){ }
含有泛型的接口
定义格式:
修饰符 interface接口名 { }
定义类时确定泛型的类型
此时,泛型E的值就是String类型。
始终不确定泛型的类型,直到创建对象时,确定泛型的类型
泛型通配符
泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
泛型不存在继承关系 Collection list = new ArrayList();这种是错误的。
通配符高级使用----受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。