泛型是一种参数化的集合,它限制了添加进集合的类型。泛型的本质是一种参数化类型。多态也可以看成是泛型的机制。一个类继承了父类,那么就能通过它的父类找到对应的子类,但是不能通过其他类找到具体要找的类。泛型的设计就是希望对象或方法的表达能力刚广泛。
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。