目录介绍
- 1.泛型的概述
- 2.泛型的格式
- 3.泛型的好处
- 4.泛型的使用
- 4.1 泛型类的概述及使用
- 4.2 泛型方法的概述和使用
- 4.3 泛型接口的概述和使用
- 5.泛型高级之通配符
- 6.可变参数的概述和使用
1.泛型的概述
-
1.1 泛型由来
- 我们的集合可以存储多种数据类型的元素,那么在存储的时候没有任何问题,但是在获取元素,并向下转型的时候,可能会存在一个错误,而这个错误就是ClassCastException . 很显然,集合的这种可以存储多种数据类型的元素的这个特点,不怎么友好 , 程序存在一些安全隐患,那么为了出来这种安全隐患,我们应该限定一个集合存储元素的数据类型,我们只让他存储统一中数据类型的元素,那么在做向下转型的是就不会存在这种安全隐患了. 怎么限定集合只能给我存储同一种数据类型的元素呢? 需要使用泛型。
-
1.2 基本概述
- 是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。
2.泛型的格式
- 2.1 泛型格式如下
- <数据类型> 这里的数据类型只能是引用数据类型
- <数据类型1 , 数据类型2 , ....>
3.泛型的好处
- 3.1 好处
- (1):把运行时期的问题提前到了编译期间
- (2):避免了强制类型转换
- (3):优化了程序设计,解决了黄色警告线
4.泛型的使用
-
4.1 泛型类的概述及使用
- A:泛型类概述: 把泛型定义在类上
- B:定义格式: public class 类名<泛型类型1,…>
- C:注意事项: 泛型类型必须是引用类型
-
4.2 泛型方法的概述和使用
- A:泛型方法概述: 把泛型定义在方法上
- B:定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名)
public <T> void show(T t) {
}
- 4.3 泛型接口的概述和使用
- A:泛型接口概述: 把泛型定义在接口上
- B:定义格式: public interface 接口名<泛型类型>
/**
* 泛型接口的定义格式: 修饰符 interface 接口名<数据类型> {}
*/
public interface Inter<T> {
public abstract void show(T t) ;
}
/**
* 子类是泛型类
*/
public class InterImpl<E> implements Inter<E> {
@Override
public void show(E t) {
System.out.println(t);
}
}
Inter<String> inter = new InterImpl<String>() ;
inter.show("hello") ;
5.泛型高级之通配符
- 5.1 高级使用方法技巧
- A:泛型通配符<?>: 任意类型,如果没有明确,那么就是Object以及任意的Java类了
- B:? extends E: 向下限定,E及其子类
- C:? super E: 向上限定,E及其父类
6.可变参数的概述和使用
- 6.1 概述
- A:可变参数概述: 定义方法的时候不知道该定义多少个参数
- B:格式: 修饰符 返回值类型 方法名(数据类型… 变量名){}
- C:注意事项:
- a: 这里的变量其实是一个数组
- b: 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个