classAnimal{}classDogextendsAnimal{}classCatextendsAnimal{}publicclassCollection{publicstaticvoidmain(String[]args){// 泛型如果明确的写的时候,前后必须一致Collection<Object>c1=newArrayList<Object>();// Collection<Object> c2 = new ArrayList<Animal>();// Collection<Object> c3 = new ArrayList<Dog>();// Collection<Object> c4 = new ArrayList<Cat>();// ?表示任意的类型都是可以的Collection<?>c5=newArrayList<Object>();Collection<?>c6=newArrayList<Animal>();Collection<?>c7=newArrayList<Dog>();Collection<?>c8=newArrayList<Cat>();// ? extends E:向下限定,E及其子类// Collection<? extends Animal> c9 = new ArrayList<Object>();Collection<?extendsAnimal>c10=newArrayList<Animal>();Collection<?extendsAnimal>c11=newArrayList<Dog>();Collection<?extendsAnimal>c12=newArrayList<Cat>();// ? super E:向上限定,E极其父类Collection<?superAnimal>c13=newArrayList<Object>();Collection<?superAnimal>c14=newArrayList<Animal>();// Collection<? super Animal> c15 = new ArrayList<Dog>();// Collection<? super Animal> c16 = new ArrayList<Cat>();}//可以使用&符号多重限定<TextendsSerializable&Cloneable>voiddeepClone(Tt){}//异常采用泛型privatestatic<TextendsException>sayHello()throwsT{try{}catch(Exceptione){// 这里不能用Tthrow(T)e;}}}
通配符问题
定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?
//错误方式:publicstaticvoidprintCollection(Collection<Object>cols){for(Objectobj:cols){System.out.println(obj);}cols.add("string");//没错//cols = new HashSet<Date>();//错误}// 正确方式:publicstaticvoidprintCollection(Collection<?>cols){for(Objectobj:cols){System.out.println(obj);}//cols.add("string");//错误,因为它不知自己未来匹配就一定是Stringcols.size();//没错,此方法与类型参数没有关系cols=newHashSet<Date>();}