泛型(一种未知的数据类型)
泛型可以看作是一个变量,用来接收数据类型,eg. E:Element元素(未知的
数据类型)
注意: 泛型的标志是那对尖括号,里面的泛型接收值可自定义
定义含有泛型的类与方法
定义含有泛型的类:
格式:
class 类名<泛型> {
}
定义含有泛型的方法:泛型定义在修饰符与返回值类型之间
格式:
修饰符 <泛型> 返回值类型 方法名(参数列表(可以使用泛型)){
//方法体
}
泛型使用的利弊
使用泛型
利:
1.避免了类型转换的麻烦,存储的只能是一种类型
2.把运行期的异常(代码运行之后会抛出的异常),提前到了编译期(写代码的时候报错)
弊:
1.泛型接受的数据类型是什么,就只能存储什么类型的数据
不适用泛型:
利:
集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊:
不安全,会引发异常
定义和使用含有泛型的接口
含有泛型的接口,第一种使用方式:
定义接口的实现类,实现接口,指定接口的泛型,eg.
public interface Iterator<E> {
E next();
}
Scanner类实现了Iterator接口,并指定接口的泛型为String,所以重写的方法next()的泛型默认为String
public final class Scanner implements Interator<String> {
public String next( ){
}
}
第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走。
即创建了一个含有泛型的类,在创建对象的时候确定泛型的类型,eg.
public interface List<E>{
boolean add(E e);
E get(int index);
}
public class ArraysList<E> implements List<E> {
public boolean add(E e);
public E get(int index);
}
泛型通配符:
<?>:代表任意的泛型使用方式: 不能用来创建对象使用,只能作为方法的参数使用,即用来接收泛型数据
注意事项: 泛型没有继承的概念
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("aaa");
list1.add("bbb");
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(123);
list2.add(456);
printArray(list1);
printArray(list2);
}
public static void printArray(ArrayList<?> list){
/*for(Object item:list){
System.out.println(item);
}*/
Iterator<?> temp = list.iterator();
while(temp.hasNext()){
Object next = temp.next();
System.out.println(next);
}
}
泛型的上下限限定
泛型的上限限定:<? extends E> 代表使用的泛型只能是E类型的子类/本身
泛型的下限限定:<? super E> 代表使用的泛型只能是E类型的父类/本身