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