在 Kotlin 中,`T` 通常用作类型参数的占位符,它在实例化或传递参数时会被替换成具体的类型。
Kotlin 支持泛型,这意味着您可以编写可以与多种数据类型一起工作的代码,而不必为每种数据类型编写单独的代码。
泛型类和函数
在 Kotlin 中,创建泛型类和函数,如下所示:
```kotlin
// 泛型类
class Box<T>(var value: T)
// 泛型函数
fun <T> singletonList(item: T): List<T> {
// ...
}
```
泛型约束
对泛型类型参数施加约束,以限制它们可以接受的类型。例如,可以指定一个上界,表示类型参数必须是特定类型或其子类型:
```kotlin
// 泛型函数,T 必须是 Comparable 的子类型
fun <T : Comparable<T>> sort(list: List<T>) {
// ...
}
```
类型投影
Kotlin 还支持类型投影,这允许在不知道具体类型的情况下安全地使用泛型类型。类型投影包括 `out` 投影(协变)和 `in` 投影(逆变),以及星号投影(`*`),后者允许在不知道具体类型的情况下读取或写入类型参数:
```kotlin
// 协变投影
val listOut: List<*> = arrayListOf("apple", "banana")
// 逆变投影
val listIn: List<out Apple> = arrayListOf(Apple(), Orange())
// 星号投影
val listStar: List<*> = arrayListOf(1, 2, 3)
```
泛型的使用
在使用泛型时,应该注意类型擦除的概念。在编译后的字节码中,泛型类型参数的具体类型信息会被擦除,这意味着在运行时无法得知泛型参数的实际类型。因此,在某些情况下,可能需要使用类型检查和转换来确保类型安全。