classArrayStackGenerics<E>{privatefinalint CAP =16;//初始容量privateint capacity =0;//当前容量, 也是插入元素的位置(即栈顶+1)private E[] elements;publicArrayStackGenerics(){
elements =(E[])newObject[CAP];}publicintgetSize(){return capacity;}publicbooleanisEmpty(){return capacity ==0;}public E top(){return elements[capacity-1];}publicvoidpush(E e){ensureCapcity();
elements[capacity++]= e;}public E pop(){
E result = elements[--capacity];
elements[capacity]= null;//把当前引用,即上一个栈顶元素引用置为nullreturn result;}publicvoidensureCapcity(){if(elements.length ==getSize()){
elements = Arrays.copyOf(elements,getSize()*2+1);}}}
item 30: 倾向于使用泛型函数
publicclassTestGenericMethods_30{publicstaticvoidmain(String[] args){//
Set<String> s1 =newHashSet<>();
Set<String> s2 =newHashSet<>();
s1.add("a"); s2.add("b");
System.out.println(union(s1,s2));// identity()的作用是接受一个对象,返回该对象本身。// 使用泛型后的好处是,不需要为每一类的对象写一个方法。可以将UnaryOperator的类型设置Object,但这样作将输入参数的类型均向上转型为了Object
String[] strs =newString[]{"ab","c"};
UnaryOperator<String> sameString =identity();for(String s: strs)
System.out.println(sameString.apply(s));
Integer[] ints =newInteger[]{1,2};
UnaryOperator<Integer> sameInteger =identity();for(int i: ints)
System.out.println(sameInteger.apply(i));//recursive type bound
List<Integer> list = Arrays.asList(1,2,3);
System.out.println("max of (1, 2, 3) = "+max(list));
List<String> stringList = Arrays.asList("a","b","z");
System.out.println("max of (a, b, z) = "+max(stringList));}publicstatic<T> Set<T>union(Set<T> s1, Set<T> s2){
Set<T> s =newHashSet<>(s1);
s.addAll(s2);return s;}privatestatic UnaryOperator<Object> IDENTITY_FUNC =(t)->{return t;};@SuppressWarnings("unchecked")publicstatic<T> UnaryOperator<T>identity(){return(UnaryOperator<T>) IDENTITY_FUNC;}// 限制了E必须是实现了对应类型的Comparable接口publicstatic<E extendsComparable<E>> E max(Collection<E> c){
E res = null;for(E r: c){if(res == null){
res = r;continue;}if(r.compareTo(res)>0)
res = r;}return res;}}