泛型是一种参数化的集合,它限制了添加进集合的类型。泛型的本质是一种参数化类型。多态也可以看成是泛型的机制。一个类继承了父类,那么就能通过它的父类找到对应的子类,但是不能通过其他类找到具体要找的类。泛型的设计就是希望对象或方法的表达能力刚广泛。
1、用泛型表示类
package day09;
//此处的T可以随便写任意标识,常见的有T、E、K、V等形式的参数用于表示泛型
public class GenericDemo04<T> {
//value这个成员变量的类型为T,T的类型由外部指定
private T value;
public GenericDemo04(T value) {
this.value = value;
}
public T getValue() { //泛型方法getkey的返回值类型是T,T的类型由外部指定
return value;
}
public void setValue(T value) {
this.value = value;
}
}
2、用泛型表示接口
package day09;
//定义一个泛型接口
public interface GeneratorDemo<T> {
public T next();
}
一般泛型接口常用于生成器(generator)中,生成器相当于对象工厂,是一种专门用来创建对象的类。
3、泛型表示方法
package day09;
public class GenericMethods {
public <T> void f(T x) {
System.out.println(x.getClass().getName());
}
}
4、泛型通配符
List是泛型类,为了表示各种泛型list的父类可以使用类型通配符,类型通配符使用问号(?)表示,它的元素类型可以匹配任何类型。例如:
1 package day09;
2
3
4
5 import java.util.*;
6
7
8
9 class Generic {
10
11 public static void main(String[] args) {
12
13 List name = new ArrayList<String>();
14
15 List<Integer> age = new ArrayList<Integer>();
16
17 List<Number> number = new ArrayList<Number>();
18
19 name.add("yang");
20
21 age.add(19);
22
23 number.add(90);
24
25 DemoGeneric(name);
26
27 DemoGeneric(age);
28
29 DemoGeneric(number);
30
31
32
33 }
34
35
36
37 public static void DemoGeneric(List<?> data) {
38
39 System.out.println("测试一下:" + data.get(0));
40
41 }
42
43
44
45 }
运行结果:
上界通配符:<? extends ClassType>该通配符为ClassType的所有子类型。它表示的是任何类型都是ClassType类型的子类。
下界通配符:<? super ClassType>该通配符为ClassType的所有超类型。它表示的是任何类型的父类都是ClassType。