Kotlin學習:第十章泛型的高階特性
阿新 • • 發佈:2021-02-11
10.1對泛型進行實化
在java中,我們建立一個List<String>集合,雖然在編譯時器只能向集合中新增字串型別的元素,但是在執行時器JVM並不能知道它本來只打算包含哪種型別的元素,只能識別出來它是個List。
Kotlin中是可以將行內函數中的泛型進行實化的。
那麼具體該怎麼寫才能將泛型實化?首先該函式必須是行內函數才行,也就是需要inline關鍵字來修飾該函式。其次,在宣告泛型的地方必須加上reified關鍵字來表示該泛型要進行實化。如下:
inline fun <reified T> getGenericType() { }
上述函式中的泛型T就是一個被實化的泛型,因為它滿足了行內函數和reified關鍵字這倆個前提條件。那麼藉助泛型實化,我們可以實現什麼效果呢?
這裡我們準備實現一個獲取泛型實際型別的功能。
inline fun<reified T> getGenericType() = T::class.java
雖然只有一行程式碼,但是這裡卻實現了一個java中完全不可能實現的功能:getGenericType()函式直接返回了當前指定泛型的實際型別。T.class這樣的語法在Java中是不合法的,而在Kotlin中,藉助泛型化功能就可以使用T::class:java這樣的語法了。
現在我們用如下的程式碼進行測試:
fun main() {
val result1 = getGenericType<String>()
val result2 = getGenericType<Int>()
println("result1 is $result1")
println("result2 is $result2")
}
可以看到如果將泛型指定成了String,那麼就可以得到java.lang.String型別。如果設定成Int就可以得到java.lang.Integer型別。