JAVA泛型的学习(2)
1.受限泛型类型
<E extends xxx>将E指定为xxx的泛型子类型
非受限泛型<E>等同于<E extends Object>
public static <E extends Comparable<E>> void sort(E[] list) {
//E表示是Comparable<E>的子类型
}
2.原始类型(不安全,会引起运行时错误无法体现泛型的好处)
GenericStack stack = new GenericStack();
大体等同于GenericStack<Object> stack = new GenericStack<Object>();
3.通配泛型
三种形式
- ? 等价于<? extends Object>
- ?extends T 表示T或T的子类型的通配类型
- ? super T 表示T或T的父类型的通配类型
package study;
import java.util.ArrayList;
public class Note1 {
public static void main(String[] args) {
GenericStack<Integer> intStack = new GenericStack<>();
intStack.push(1);
intStack.push(2);
intStack.push(3);
System.out.println(max(intStack));
}
public static double max(GenericStack<Number> stack) {
、、、
}
}
在这个例子中max(intStack)会出现编译错误,
尽管Integer是Number的子类型,但GenericStack<Integer>不是GenericStack<Number>的子类型,为此可以将max函数改为public static double max(GenericStack<?extends Number> stack),
GenericStack<?extends Number>是一个表示Number或Number的子类型的通配类型
泛型类型与通配类型之间的继承关系图: