kotlin學習(8)泛型

泛型的聲明

  與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

相關文章
相關標籤/搜索