一.基本概念
“泛型”的字面意思就是广泛的类型。类,接口和方法带可以应用于非常广泛的类型。用一套代码可以用于多种数据类型,这样不仅可以复用代码,降低耦合性,而且还提高了代码的可读性以及安全性。
二.泛型的使用
1.泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
2.Java 中的泛型是伪泛型, 实现方式类型擦除。
类型擦除:
Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
【泛型信息只存在编译阶段,在进入JVM之前,与泛型相关的信息会被擦除。】
类型擦除可以参考https://www.cnblogs.com/wuqinglong/p/9456193.html
类型擦除的例子:
3.泛型中K T V E ? object等的含义
http://www.hollischuang.com/archives/252
三.例子
1)泛型用在类上:
package com.test.model;
/**
* @Author tanghh
* @Date 2020/2/25 16:24
*/
public class ShoesModel<T> {
T oneShones;
T twoShones;
public ShoesModel(T oneShones, T twoShones) {
this.oneShones = oneShones;
this.twoShones = twoShones;
}
public T getOneShones() {
return oneShones;
}
public void setOneShones(T oneShones) {
this.oneShones = oneShones;
}
public T getTwoShones() {
return twoShones;
}
public void setTwoShones(T twoShones) {
this.twoShones = twoShones;
}
}
package com.test.nodefault;
import com.test.model.ShoesModel;
/**
* @Author tanghh
* @Date 2020/2/25 16:31
*/
public class TestShones {
public static void main(String[]args){
ShoesModel<Integer> pairInteger = new ShoesModel<Integer>(1,2);
int one1 = pairInteger.getOneShones();
int two1 = pairInteger.getTwoShones();
System.out.println("one:"+one1+",two:"+two1);
ShoesModel<String> pairString = new ShoesModel<String>("I","测试");
String one3 = pairString.getOneShones();
String two3 = pairString.getTwoShones();
System.out.println("one:"+one3+",two:"+two3);
}
}
运行结果:
例子总结: 与普通类不同的点是 ShonesModel<T> 多了一个T,测试的时候String 类型,Integer 类型的值都可以填入。
2)泛型用在集合类上
集合遍历存在问题:
因为list集合中的元素存储了String类型,Integer类型的数据,强制成String类型的时候报错了。
四. 泛型的好处:
- 代码复用:我们一套代码可以支持不同的类性。
- 降低了耦合性:代码逻辑和数据类型之间分离,实现了解耦。
- 更好的可读性:我们在使用集合的时候,定义了一个list 如
List<String>
,一看便知道这个一个存放String类型的list。- 更高的安全性:语言和程序设计的一个重要目标就是将bug消灭在摇篮里,能在写的时候消灭,就不要留在运行的时候。如我们定义一个
List<String>
这样的一个list。当我们往list里面放其他非String类型的数据时,我们的IDE(如Eclipse)就会报错提示。就算没有IDE。编译时,Java编译器也会提示,这称之为类型安全。这样就为程序设置了一道安全防护。同样的,使用泛型还可以省去使用普通对象时繁琐的强制类型转换。相反,使用普通对象,编译时并不会提示。假如传入的参数类型和最后强制类型转换的类型不一致。运行时就会出现ClassCastException,使用泛型则不会。