1.什么是泛型
泛型指的就是“参数化类型”。也就是将类型由原来的具体的类型参数化。
就比如:定义一个方法去处理String的数据,但后面需要处理Int的数据呢?则又需要进行重载,这就导致了很多代码的重复。这里有的会说,使用Object类型,虽然Object类型可以接收任何的数据类型,但如果想用Object进行算数运算呢?我传一个String类型的数据,然后正好运算时要使用double类型的数据,显然,这时候会有bug,因为String类型强转成double的时候会出现异常
**所以这时候就需要使用泛型,先不定义具体的类型,等到需要使用时在通过泛型设置指定的类型(泛型需要注入的是包装类)例如ClassName<Integer>
等,ClassName<int>
则会爆红提示有错误,并提示。
2.泛型的三种使用方式
2.1 泛型类
例如:定义一个泛型类
public class ClassName<T>{
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
这个T也就是一个代表的数据类型,如果在后续使用ClassName类时,设置的T也就会变成对应的数据类型,例如使用
ClassName<String>
的话,那么ClassName类中,原本的T所在的地方就会变成String类型
设置指定属性后就像如下代码
public class ClassName<String>{
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
2.2泛型接口
一个泛型的接口
public interface IntercaceName<T>{
T getData();
}
在实现接口时,可以自由选择指定泛型类型,也可以选择不指定, 如下:
指定类型:
public class Interface1 implements IntercaceName<String> {
private String text;
@Override
public String getData() {
return text;
}
}
不指定类型:
public class Interface1<T> implements IntercaceName<T> {
private T data;
@Override
public T getData() {
return data;
}
}
具体使用起来与泛型类相似,就不多做赘述。
2.3泛型在方法的使用
泛型在方法中使用的话,作用域就仅限于方法
例如:
public class Main1 {
public static void main(String[] args) {
//右边的<>中的String在JDK1.7后即可省略,1.7后默认与左边<>一致
// Person<Integer> person = new Person<>();
printInfo("123");
//输入数字型的则会自动装箱
printInfo(456);
}
public static <T> void printInfo(T t){
System.out.println(t);
}
}
输出如下
最后!
泛型的作用
1、 提高代码复用率
2、 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
注意:
在编译之后程序会采取去泛型化的措施。
也就是说Java中的泛型,只在编译阶段有效。
在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加
类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。