泛型将接口的概念进一步延伸,“泛型”的字面意思就是广泛的类型。
直接看代码:
- public class Pair
{ - T first;
- T second;
-
- public Pair(T first, T second) {
- this.first = first;
- this.second = second;
- }
-
- public T getFirst() {
- return first;
- }
-
- public T getSecond() {
- return second;
- }
- }
Pair就是一个泛型类,与普通类的区别体现在:
1)类名后面多了一个
2)first和second的类型都是T。
T表示类型参数,泛型就是类型参数化,处理的数据类型不是固定的,而是可以作为参数传入。
下面代码是用这个泛型类,并传递类型参数:
- PairV1
minMax = new PairV1(1, 100); - Integer min = minMax.getFirst();
- Integer max = minMax.getSecond();
-
- PairV1
kv = new PairV1("name", "java"); - String key = kv.getFirst();
- String value = kv.getSecond();
类型参数可以有多个,Pair类中的first和second可以是不同的类型,多个类型之间以逗号分隔,来看改进后的Pair类定义:
- public class PairV2 {
- U first;
- V second;
-
- public PairV2(U first, V second) {
- this.first = first;
- this.second = second;
- }
-
- public U getFirst() {
- return first;
- }
-
- public V getSecond() {
- return second;
- }
-
- public static void main(String[] args) {
- PairV2
minMax1 = new PairV2("name", 100); - PairV2
minMax = new PairV2<>("name", 100); - String min = minMax.getFirst();
- Integer max = minMax.getSecond();
- System.out.println(min);
- System.out.println(max);
- List
a = new ArrayList<>(); - }
- }
泛型的内部原理其实就是直接使用Object定义普通类。
- public class PairV3 {
- Object first;
- Object second;
-
- public PairV3(Object first, Object second) {
- this.first = first;
- this.second = second;
- }
-
- public Object getFirst() {
- return first;
- }
-
- public Object getSecond() {
- return second;
- }
-
- public static void main(String[] args) {
- PairV3 minMax = new PairV3(1, 100);
- Integer min = (Integer) minMax.getFirst();
- Integer max = (Integer) minMax.getSecond();
- System.out.println(min); // 1
- System.out.println(max); //100
-
- PairV3 kv = new PairV3("name", "java");
- String key = (String) kv.getFirst();
- String value = (String) kv.getSecond();
- System.out.println(key); // name
- System.out.println(value); // java
- }
- }
对于泛型类,Java编译器会将泛型代码转换为普通的非泛型代码,就像上面的普通Pair类代码及其使用代码一样,将类型参数T擦除,替换为Object,插入必要的强制类型转换。Java虚拟机实际执行的时候,它是不知道泛型这回事的,只知道普通的类及代码。
1)更好的安全性
2)更好的可读性
注:
以上内容来源于《Java编程的逻辑》,感兴趣的可以看原书籍