1. 我们先写一个没有泛型的类Box:
1 public class Box { 2 3 private Object obj; 4 5 public Box() {} 6 7 public Object getObj() { 8 return obj; 9 } 10 11 public void setObj(Object obj) { 12 this.obj = obj; 13 } 14 15 public Box(Object obj) { 16 super(); 17 this.obj = obj; 18 } 19 20 }
这时我们可以存入任意类型的数据, 反正他们都是Object的子类, 存入时会自动类型提升. 没有任何检查方法.
我们来将其改为带有泛型的类:
1 public class Box<T> { 2 3 private T obj; 4 5 public Box() {} 6 7 public T getObj() { 8 return obj; 9 } 10 11 public void setObj(T obj) { 12 this.obj = obj; 13 } 14 15 public Box(T obj) { 16 super(); 17 this.obj = obj; 18 } 19 20 }
就是这么简单, 只需在类名称的后面加上<T>即可, 在类中使用T来代表泛型指定的数据类型.
2. 这里顺便说一下类型参数的命名规范:
理论上你可以起任何你想要起的名字, 但最好是单个大写字母, 下面是一些约定俗成规范:
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- S、U、V - 2nd、3rd、4th types
3. 使用该类的时候, 我们就可以这样写:
1 Box<String> b = new Box<>(); 2 b.setObj("aaa"); 3 // b.setObj(11); // 编译报错 4 String s = b.getObj();
4. 使用多个类型参数:
在我们使用Map时应该已经注意到了, Map使用泛型时需要设定两个类型参数, 如HashMap<String, Integer>. 我们在定义自己的泛型类的时候也可以定义多个类型参数, 如:
1 public class Box<T1, T2, T3> { 2 3 private T1 t1; 4 private T2 t2; 5 private T3 t3; 6 7 public Box() {} 8 9 public Box(T1 t1, T2 t2, T3 t3) { 10 super(); 11 this.t1 = t1; 12 this.t2 = t2; 13 this.t3 = t3; 14 } 15 16 public T1 getT1() { 17 return t1; 18 } 19 20 public void setT1(T1 t1) { 21 this.t1 = t1; 22 } 23 24 public T2 getT2() { 25 return t2; 26 } 27 28 public void setT2(T2 t2) { 29 this.t2 = t2; 30 } 31 32 public T3 getT3() { 33 return t3; 34 } 35 36 public void setT3(T3 t3) { 37 this.t3 = t3; 38 } 39 40 }
使用:
1 Box<String, Integer, Double> b = new Box<>("aaa", 10, 3.14); 2 System.out.println(b.getT1()); 3 System.out.println(b.getT2()); 4 System.out.println(b.getT3());