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);