與Java不一樣的是,Kotlin要求類型實參要麼被顯示的說明,要麼能被編譯器推導出來。由於Java在1.5版本才引入泛型,因此爲了兼容過去的版本,能夠不直接聲明List類型的變量,而不說明類型。ide
//下面兩種是等價的 val readers = arrayListOf<String>() val readers:ArrayList<String>=arrayListOf()
// 第一處是類型形參聲明,第二三處分別是接收者和返回類型使用了類型形參 fun <T> List<T>.slice(indices: IntRange): List<T>{ val res=arrayListOf<T>() indices.forEach{ res.add(this[it]) } return res } //調用 >>>val letters=('a'..'z').toList() >>>println(letters.slice<Char>(0..2)) //這裏顯式的指定類型實參 [a,b,c] >>>println(letters.slice(1..2)) //這裏能夠根據letters推導出類型爲Char [a,b,c]
泛型屬性同理函數
//List接口定義了類型參數T interface List<T>{ //在類或接口的內部,T能夠看成普通類型使用 operator fun get(index: Int): T } //這個類實現了List,提供了具體類型實參String class StringList: List<String>{ override get(index: Int): String { //xxxxx } } //如今ArrayList的泛型類型形參T就是List的類型實參 class ArrayList<T>: List<T>{ override get(index: Int): T { //xxxxx } }
「 <T extends Number> 」表明類型形參必定屬於Number類型,限制了它的上界。this
" <T : Any> " 表明T的類型必定是非空的,它不接受傳入<String?>這樣的可空實參。spa
if ( value is List<*> ){ ... } 這樣之判斷了value是否爲List,而不用在乎類型實參具體是什麼。code