1. 程式人生 > 其它 >Kotlin學習:第十章泛型的高階特性

Kotlin學習:第十章泛型的高階特性

技術標籤:Kotlin學習kotlin

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")
}

image.png

可以看到如果將泛型指定成了String,那麼就可以得到java.lang.String型別。如果設定成Int就可以得到java.lang.Integer型別。