Java 泛型介绍
泛型在 Java 中引入了其版本(1.)5。这些在编译期间被擦除,因此不能对它们进行运行时反射。泛型生成由其他类型参数化的新类型。例如,为了使用 String
s 和 Number
s 的类型安全集合,我们不必创建新类,通用 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);