一、说明
- 泛型(generics)本质是参数化类型,所操作的数据类型被指定为一个参数
- 提供编译时类型安全检测机制,允许程序员在编译时检测到非法的类型
二、理解
Java 泛型
- Java中的泛型只在编译阶段有效,不会进入到运行阶段
- 泛型有三种使用方式,泛型类、泛型接口、泛型方法
泛型类
- 类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开
泛型接口
- 该方法在调用时可以接收不同类型的参数
有界的类型参数
- 限制被允许传递到一个类型参数的类型种类范围
- 声明一个有界的类型参数,首先列出类型参数的名称,后跟
extends
关键字,最后紧跟它的上界
泛型标记符
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的 java 类型
类型通配符
- 一般使用
?
代替具体的类型参数
<? extends T>
表示该通配符所代表的类型是T类型的子类
<? super T>
表示该通配符所代表的类型是T类型的父类
三、实现
1.泛型类
创建genericity
类,实现写入和读取数据
public class genericity { public static class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); Box<String> stringBox = new Box<String>(); integerBox.add(17); stringBox.add(new String("Hello World")); System.out.printf("Integer Value :%d\n", integerBox.get()); System.out.printf("String Value :%s\n", stringBox.get()); } } }
2.泛型方法
创建genericity
类,比较三个值并返回最大值
public class genericity { public static <T extends Comparable<T>> T maximum(T x, T y, T z){ T max = x; if (y.compareTo(max) > 0){ max = y; } if (z.compareTo(max) > 0){ max = z; } return max; } public static void main(String[] args) { System.out.printf( "Max of %d, %d and %d is %d\n", 13, 14, 17, maximum( 13, 14, 17 ) ); System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n", 5.5, 2.2, 7.7, maximum( 5.5, 2.2, 7.7 ) ); System.out.printf( "Max of %s, %s and %s is %s\n", "Shea", "Good", "Yeats", maximum( "Shea", "Good", "Yeats" ) ); } }
3.类型通配符
public class genericity { public static void getData(List<?> data) { System.out.println("data :" + data.get(0)); } public static void main(String[] args) { List<String> name = new ArrayList<String>(); List<Integer> age = new ArrayList<Integer>(); List<Number> number = new ArrayList<Number>(); name.add("Yeats"); age.add(17); number.add(17.17); getData(name); getData(age); getData(number); } }