上篇博客介绍了泛型的一点基础的东西,这篇博客来写一下关于泛型通配的东西。
泛型通配有三种
1. 非受限通配 <?> 或者<? extends Object>
2. 受限通配<? extends T>
3. 下限通配<? extends T>
GenericStack.class
代码如下
import java.util.ArrayList; /***************************************** GenericStack() 创造一个空栈 getSize() int 返回栈中元素的个数 peek() T 返回栈顶元素 pop() T 返回并移除栈顶元素 push(T) void 添加元素 isEmpty() boolean 判断栈是否为空 ****************************************/ public class GenericStack <T>{ public static void main(){ } private ArrayList<T> list = new ArrayList<>(); public int size(){ return list.size(); } public T peek(){ return list.get(list.size()-1); } public T pop(){ T a = list.get(list.size()-1); list.remove(list.get(list.size()-1)); return a; } public boolean isEmpty(){ return list.isEmpty(); } }
//
看这段代码和注释
public class WildCardNeedDemo { 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)); //这里报错是因为虽然Integer是Number的子类 但是Generic<Integer>不是Generic<Number>的子类 } public static double max(GenericStack<Number> stack){ double max = stack.pop().doubleValue(); while(!stack.isEmpty()){ double value = stack.pop().doubleValue(); if(value>max) max = value; } return max; } }
但是我们把max函数的改成public static double max(GenericStack<?extends Number> stack)就OK了
什么是需要用到<? super T>? 看下面的例子
代码如下 public class SuperWildCardDemo { public static void main(String [] args){ GenericStack<String> stack1 = new GenericStack<>(); GenericStack<Object> stack2 = new GenericStack<>(); stack2.push("java"); stack2.push(2); stack1.push("sun"); add(stack1,stack2); //如果把add方法改为public static <T> void add(GenericStack<T> stack1,GenericStack<T> stack2)变回报错 } public static <T> void add(GenericStack<T> stack1,GenericStack<? super T> stack2){ while(!stack1.isEmpty()){ stack2.push(stack1.pop()); } } }
溜了溜了