泛型的概念
- Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
- 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型),也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法
泛型的特性
-
类型安全性
编译器在编译期就会做类型检查,告知是否插入了错误类型的对象,使得程序更加安全
没用泛型集合演示:
ArrayList list=new ArrayList();
list.add("泛型");
list.add(666);
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
String str=(String)o;
System.out.println(str);//报错ClassCastException
}
插入了错误的类型对象,在运行时的转换处理就会出错,ClassCastException
使用泛型集合演示:
ArrayList<String>strList=new ArrayList<>();
strList.add("java");
strList.add("java劝退指南");
for (int i = 0; i < strList.size() ; i++) {
String s=strList.get(i);
System.out.println(s);//打印正常
}
-
消除强制转换
消除源代码中的许多强制类型转换,使得代码更加可读,减少了出错机会
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
-
少去了装箱拆箱操作,提高效率
-
提高代码的利用性
泛型的使用方式
-
泛型类
-
泛型接口
-
泛型方法
泛型类:把泛型定义在类上
格式:
public class 类名 <泛型类型1,...> {
}
ps:泛型类型必须是引用类型,不能是基本数据类型
尖括号中填写类型参数规范
T:任意类型 type
E:集合中元素的类型 element
K:key-value形式 key
V: key-value形式 value
封装一个泛型类:
public class GenericClass<T> {
private T value;
public GenericClass(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Test类:
//String类型
GenericClass<String> str = new GenericClass<>("学习泛型");
System.out.println(str.getValue());
//Integer类型
GenericClass<Integer> number = new GenericClass<>(123);
System.out.println(number.getValue());
泛型方法:把泛型定义在方法上
格式:
public <泛型类型> 返回类型 方法名(泛型类型 变量名) {
}
ps:方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。当调用fun()方法时,根据传入的实际对象,编译器就会判断出类型形参T所代表的实际类型
实例演示:
class Demo{
public <T> T fun(T t){ // 可以接收任意类型的数据
return t ; // 直接把参数返回
}
}
public class Demo{
public static void main(String args[]){
Demo d = new Demo() ; // 实例化Demo对象
String str = d.fun("劝退") ; // 传递字符串
int i = d.fun(30) ; // 传递数字,自动装箱
System.out.println(str) ; // 输出内容
System.out.println(i) ; // 输出内容
}
}
泛型接口:把泛型定义在接口
格式:
public 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") ;