Java 泛型介绍

泛型在 Java 中引入了其版本(1.)5。这些在编译期间被擦除,因此不能对它们进行运行时反射。泛型生成由其他类型参数化的新类型。例如,为了使用 Strings 和 Numbers 的类型安全集合,我们不必创建新类,通用 ArrayList<T> 可以在所有情况下使用,例如:new ArrayList<String>()

例:

List<String> variable = new ArrayList<String>();

在 Java 7 中引入了一些语法糖以简化构造(<> aka。diamond):

List<String> variable = new ArrayList<>();

有趣的是,当静态方法具有返回值时(通常在 Google Guava 中使用),也可以(从 Java 5)使用类型推断 :

List<String> singleton = Collections.singletonList();//Note the missing `<>` or `<String>`!

在 Java 中,存在类型用于为类型提供多态性,因为泛型类型是不变的(例如:List<String> 不是子类型,也不是 List<CharSequence> 的超类型,尽管在 Java 中 String[]CharSequence[] 的子类型;注意:String 实现了 CharSequence 界面)。存在泛型类型可表示为:

List<? extends CharSequence> list = new ArrayList<String>();
Comparable<? super ChronoLocalDate> ccld = LocalDate.now();
ChronoLocalDate cld = JapaneseDate.now(); //ChronoLocalDate extends Comparable<ChronoLocalDate>
ccld.compareTo(cld);
//cld.compareTo(ccld);//fails to compile because ccld is not a `ChronoLocalDate` (compile time)

这两个实例都可以在由相应的 Comparable 参数化的列表中使用:

List<Comparable<? super ChronoLocalDate>> list2 = new ArrayList<>();
list2.add(cld);
list2.add(ccld);