1 泛型的好处
泛型的好处:
1.避免强制类型转换的麻烦
2.将运行时异常,提前到了编译时期,降低了程序员的工作量
3.一旦指定泛型,数据类型将被统一
4.实现代码的模板化,把数据类型当做参数传递
2 泛型可以定义在哪些地方?
1.可以定义在类上
2.可以定义在方法(静态方法/非静态方法)上
3.可以定义在接口上
3 泛型类的定义
泛型类: 定义的类上有属于类自己的泛型 看MyClass03
定义类时,该类中需要处理某种类型的数据,但是什么类型,不确定,所以定义成泛型
泛型变量一般用大写字母表示:
T(Type),E(Element),K(Key),V(Value)泛型类的定义格式:
public class 类名<泛型变量> {
...
}
比如:
public class 类名<T> {
...
}泛型类上定义的泛型,什么时间确定具体的类型呢?
创建该类的对象时,<>中写的是什么类型,泛型就代表什么类型
4 非静态泛型方法
非静态泛型方法: 定义的方法上有属于方法自己的泛型 看MyClass04
定义方法时,该方法中需要处理某种类型的数据,但是什么类型,不确定,所以定义成泛型
泛型变量一般用大写字母表示:
T(Type),E(Element),K(Key),V(Value)泛型方法的定义格式:
//<泛型变>: 定义泛型
//参列*
修饰符 <泛型变> 返回值类型 方法名称(泛型变量 变量名称) {
...
}
举例:
修饰符 <T> 返回值类型 方法名称(T t) {
...
}方法上定义的泛型,什么时间确定具体的类型呢?
调用方法时,根据方法参数的类型,确定方法上定义的泛型的具体类型
5 静态泛型方法
静态泛型方法: 看MyClass05
静态方法不能使用类上的泛型,必须自己定义静态泛型方法的定义格式:
//<泛型变>: 定义泛型
//参列表中: 使用泛型
修饰符 static <泛型变> 返回值类型 方法名称(泛型变量 变量名称) {
...
}
举例:
修饰符 static <T> 返回值类型 方法名称(T t) {
...
}静态方法上定义的泛型,什么时间确定具体的类型呢?
调用方法时,根据方法参数的类型,确定方法上定义的泛型的具体类型
6 泛型接口
泛型接口: 看MyClass05
定义接口时,该接口中需要处理某种类型的数据,但是什么类型,不确定,所以定义成泛型
泛型变量一般用大写字母表示:
T(Type),E(Element),K(Key),V(Value)定义接口的定义格式:
public interface 接口名称<泛型变量> {
...
}
举例:
public interface 接口名称<T> {
...
}接口上定义的泛型,什么时间确定具体的类型呢?
1.实现类实现接口时,确定接口上泛型的具体类型的话,
直接指定具体类型2.定义实现类时,也不确定接口上的泛型
该实现类必须定义为泛型类
而且实现类上的泛型和接口上的泛型要保持一致
创建实现类对象时,确定具体的类型
7 泛型通配符
泛型通配符: ?
用来匹配泛型的,但是不能使用?定义泛型
注意事项:
1.泛型是不存在多态的,左侧<>中写的类型必须和右侧<>中的类型保持一致(省略右侧<>中的内容)
2.使用泛型通配符,定义变量:
List<?> list 可以接收哪些对象?
只要是List接口实现类的任意泛型对象(创建对象时,只要在<>中写上一种引用类型就可以)都可以
8 泛型的上限
父类: Person
子类: Worker
子类: Teacher
子类: JavaTeacher一个父类的子类可以有任意多个,如何表示出一个父类的任意子类呢?
?: 任意一种引用类型
泛型的上限:
? extends Person: 表示Person类型或者Person类型的任意子类型
? extends E: 表示E类型或者E类型的任意子类型
9 泛型的下限
子类: JavaTeacher
父类: Teacher
父类: Worker
父类: Person一个子类的父类可以有任意多个,如何表示出一个子类的任意父类呢?
?: 任意一种引用类型泛型的下限:
? super JavaTeacher: 表示JavaTeacher类型或者JavaTeacher类型的任意父类型
? extends E: 表示E类型或者E类型的任意父类型