Java基础-学习笔记15
15 泛型
1. 泛型
- 泛型的好处
- 编译时,检查添加元素的类型,提高了安全性
- 减少了类型转换的次数,提高效率
比如:ArrayList
arr = new ArrayList ();
在放入时,如果添加 Dog 类到 arr 里,编译器发现添加的类型不满足要求,就会报错;
在取出时,直接取出 Person 类,就不用再转型使用。
- 泛型的介绍
- 泛型又称参数化类型(一种表示数据类型的数据类型),是JDK5.0 出现的新特性,解决数据类型的安全性问题。
- 在类声明或实例化时只要制定好需要的具体类型即可。
- Java泛型可以保证如果程序在编译时没有发生警告,运行时就不会产生。
- 泛型的作用是:可以在类声明时通过一个表示表示类中某个属性的类型,或是某个方法的返回值类型,或是参数类型。
class Person<E>
{
String s; // 定义 s 的类型是 String,如果不确定是什么类型,可以用E表示
E s1; // 那么这个s1的类型,就是在创建或定义这个Person对象的时候再指定
}
Person<Integer> p1 = new Person<Integer>();
// 编译器会用 Integer 替换 E,即,指定 s1 为Interger类型
- 泛型的语法
interface 接口<T>{} 和 class 类<K,V>{}
// T、K、V 不代表值,表示类型,任意字母都可以。
2. 自定义泛型
- 2.1 自定义泛型类
基本语法
class 类名<T,R...> // ...表示可以有多个泛型
{
成员
}
使用细节:
1)普通成员可以使用泛型(属性、方法)
2)使用泛型的数组,不能初始化(因为不确定类型时无法在内存开辟空间)
3)静态方法中不能使用类的泛型
4)泛型类的类型,实在创建对象时确定的(因为创建对象时,需要指定确定类型)
5)如果在创建对象时,没有指定类型,默认为Object
- 2.2 自定义泛型接口
基本语法
interface 接口名<T,R...>
{
}
1)接口中,静态成员也不能使用泛型
2)泛型接口的类型,在继承或实现接口时确定
3)没有指定类型,默认为Object
- 2.3 自定义泛型方法
基本语法
修饰符 <T,R...> 返回类型 方法名(参数列表)
{
}
使用细节
1)泛型方法,可以定义在普通类中,也可以定义在泛型类中
2)当泛型方法被调用时,类型会确定
3)public void eat(E e){},修饰符后没有<T,R...>,eat方法不是泛型方法,而是使用了泛型
4)泛型方法可以使用类声明的泛型,也可以使用自己声明的泛型
- 2.4 泛型的继承和通配符
1)泛型不具备继承性
List<Object> list = new ArrayList<String>(); // 错误
2)<?> : 支持任意泛型类型
3)<?extends A>: 支持A类以及A类的子类,规定了泛型的上限
4)<?super A>: 支持A类以及A类的父类,不限于直接父类,规定了泛型的下限