泛型的概念
- 集合中是可以存放不同类型的对象,这是因为将所有对象都看做Object类型放入,因此从集合中取出元素时也是Object类型,需要强制类型转换,
而强制类型转换可能会引发类型转换异常 - 泛型机制,也就是在集合名称的右侧使用<数据类型>的方式来明确要求该集合中可以存放的元素类型,若放入其它类型的元素则编译报错
- 泛型只在编译时期有效,在运行时期不区分是什么类型
泛型就是在集合类型的右侧加上<数据类型>,就只能存放选择的数据类型了
编程使用
泛型不需要强制转换了
//1.准备一个支持泛型机制的List集合。明确要求集合中的要求是String类型
List<String> lt1 = new LinkedList<String>();
//2.向集合中添加元素并打印
lt1.add("one");
System.out.println("lt1="+lt1);//[one]
//3.获取集合中的元素并打印
String s = lt1.get(0);
System.out.println("获取到的元素是:"+s);//one
注意菱形特性
后面尖括号中的数据类型可以省略
//菱形特性
List<Double> lt3 = new LinkedList<>();
笔试考点
相互不能复制
//笔试考点
//试图讲lt1的数值赋值给lt3,也就是覆盖lt3中原来的数值
lt3 = lt1;//编译报错 集合中支持的类型不同
泛型机制的底层原理
泛型的本质就是参数化类型,让数据类型作为参数传递,其中E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数,用于给形式参数E进行初始化,从而使得集合中所有的E被实际参数替换
自定义泛型接口和泛型类
- 泛型接口和普通接口的区别就是后面添加了类型参数列表,可以有多个类型参数,如:<E, T, … >
- 泛型类和普通类的区别就是类名后面添加了类型参数列表,可以有多个类型参数,如:<E, T, … >等
自定义泛型类Person
其中T相当于形式参数,负责占位,具体数值由实参决定
T看作是名字为T的数据类型即可
public class Person<T> {
//这里的T是形式参数,负责在这里占个位置
private String name;
private int age;
private T gender;//这里表名gender是T类型的,取决于我们一会使用Person或new Person对象时来指定
public Person() {
}
public Person(String name, int age, T gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public T getGender() {
return gender;
}
public void setGender(T gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
泛型类的使用
集合中不支持基本数据类型
public class PersonTest {
public static void main(String[] args) {
//声明Peron类型的引用指向Person类型对象
//不指定类型,按Object类型对待
Person p1 = new Person("zhangfei",30,"male");
//打印对象特征
System.out.println(p1);
System.out.println("--------------------");
//在创建对象的同时指定数据类型,用于给T进行初始化
Person<String> p2 = new Person<>();
p2.setGender("female");
System.out.println(p2); //null 0 female
System.out.println("--------------------");
//使用boolean作为性别类型
Person<Boolean> p3 = new Person<>();
p3.setGender(true);
System.out.println(p3); //null 0 true
}
}
实例化泛型类时应该指定具体的数据类型,并且是引用数据类型而不是基本数据类型