“?” – 代表未知类型
extends – 关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类
super – 关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object
—>带有泛型的.java文件,只有被编译成.class文件后类型才能被确定:
List<? extends Date> listEx = new ArrayList<Timestamp>(); listEx.add(new Timestamp(System.currentTimeMillis())); //出错,无法确定类型, 考虑到安全性,什么都不能加入 Date date = listEx.get(1); //正确,Date作为父类可以引用子类 List<? super Date> listSu = new ArrayList<Object>(); listSu.add(new Date()); //类型不确定,只能加入Date,就算是Object也不能加入, 因为不能保证Object一定是Date的父类 Date date = listSu.get(1); //出错,Date作为子类,不能引用其父类(虽然类型未知)