在 Kotlin 中 使用泛型类和泛型函数

在 Kotlin 中,泛型是一种强大的编程特性,允许你在定义类、接口、函数时使用类型参数,从而提高代码的复用性和灵活性。

1、泛型类

  • 为类定义通用类型的语法如下所示
    在这里插入图片描述
  • 类名称后面是左尖括号 (<),后跟表示数据类型的占位符名称,再后面是右尖括号 (>)。
  • 实例化类时,系统会将 泛型类型使用的数据类型 作为用尖括号括住的形参进行传递。
    在这里插入图片描述
class Question<T>(
    val questionText: String,
    val answer: T,
    val difficulty: String
)

fun main() {
   
   
    val question1 = Question<String>("Quoth the raven ___", "nevermore"
<think> 我们被要求回答关于Kotlin中多参数泛型类的信息。根据引用,特别是引用[1]引用[2]中提到了Kotlin,其中引用[1]明确提到:“Kotlin 可以使用多个参数,使用逗号(,)分隔。”因此,我们可以基于此进行回答。 多参数泛型类:在Kotlin中,我们可以为定义多个参数。这些参数在名后的尖括号中指定,用逗号分隔。 示例: 假设我们想定义一个,它有两个参数,分别代表两种不同的。例如,一个Pair,它可以持有两个不同的值。 我们可以这样定义: ```kotlin class Pair<A, B>(val first: A, val second: B) ``` 在这个例子中,`Pair`有两个参数:`A``B`。在创建实例时,我们需要指定这两个使用: ```kotlin fun main() { // 创建一个Pair,第一个是Int,第二个是String val pair1 = Pair<Int, String>(1, "One") // 推断也可以省略参数 val pair2 = Pair(2, "Two") // 也可以不同,比如第一个是String,第二个是Int val pair3 = Pair("Three", 3) } ``` 此外,我们还可以在使用这些参数作为属性、方法参数或返回值。 另一个例子:一个可以持有三种不同值的Triple(尽管Kotlin标准库已经提供了Triple,但这里作为示例): ```kotlin class Triple<A, B, C>(val first: A, val second: B, val third: C) ``` 在引用[2]中,我们还看到泛型类可以带有约束。例如,`MagicBoxReified<T:Human>`,表示参数`T`必须是`Human`或其子。同样,多参数泛型类也可以对每个参数设置约束。 例如: ```kotlin class BoxWithConstraint<T: Comparable<T>, U: Any>(val value1: T, val value2: U) ``` 这里,`T`必须实现`Comparable<T>`接口,`U`不能是可空(因为`Any`是非空的超,而`Any?`才是包括可空)。 注意:在Kotlin中,默认的参数的上界是`Any?`(即可空)。如果我们不希望参数为空,可以指定上界为`Any`(非空)或某个非空的具体。 另外,引用[4]提到了使用内联函数reified关键字来获取的具体,但这主要针对函数,不过在多参数泛型类中,我们也可以在的方法中使用reified(但注意reified只能用于内联函数的参数,所以如果中的方法要使用reified,那么该方法必须是内联函数,并且参数是定义在方法上,而不是上)。例如,在的方法中,我们也可以定义多个参数并指定reified。 示例: ```kotlin class MyContainer<T, U> { // 错误:不能在使用reified,reified只能用于内联函数的参数 // 正确:在的方法中使用内联reified inline fun <reified T, reified U> printTypes() { println("T is ${T::class.simpleName}, U is ${U::class.simpleName}") } } ``` 但是注意,这个方法的参数`T``U`与上的`T``U`无关。因为方法上的参数是独立的,并且通过reified可以在运行时获取。 总结: Kotlin支持多参数泛型类使用逗号分隔多个参数。每个参数都可以有自己的上界约束。多参数泛型类可以增强代码的复用性安全性,允许我们在一个中处理多种不同的。 相关问题: 1. Kotlin中如何定义带有多个参数的接口? 2. 在多参数泛型类中,参数能否有多个上界? 3. Kotlin中的擦除问题如何影响多参数泛型类?如何获取多参数泛型类的具体信息? </think>### Kotlin多参数泛型类使用与介绍 在Kotlin中,多参数泛型类允许一个同时使用多个参数,通过逗号分隔实现更灵活的抽象。这种机制增强了代码的复用性安全性,尤其适用于需要处理多种数据的场景。 #### 基本语法 ```kotlin class Container<T, U>(val first: T, val second: U) ``` - **`<T, U>`**:声明两个参数 - **`first: T`**:第一个属性使用`T` - **`second: U`**:第二个属性使用`U` #### 约束 可为不同参数设置独立的上界: ```kotlin class Box<T: Comparable<T>, U: Any>(val value: T, val data: U) ``` - `T`需实现`Comparable` - `U`需为非空(`Any`等价于Java的`Object`) #### 使用示例 ```kotlin fun main() { // 显式指定 val pair1 = Pair<String, Int>("Age", 25) // 自动推断 val pair2 = Pair("Price", 99.9) // 推导为Pair<String, Double> println("${pair1.first}: ${pair1.second}") // 输出: Age: 25 println("${pair2.first}: ${pair2.second}") // 输出: Price: 99.9 } ``` #### 进阶特性 1. **协变/逆变控制**: ```kotlin class Producer<out T, out U>(val item1: T, val item2: U) class Consumer<in A, in B> ``` - `out`支持协变(输出安全) - `in`支持逆变(输入安全)[^1] 2. **结合reified检查**: ```kotlin inline fun <reified T, reified U> checkTypes(item1: T, item2: U) { println("T is ${T::class.simpleName}, U is ${U::class.simpleName}") } ``` 可运行时获取具体信息(需配合`inline`使用)[^2][^4] 3. **与扩展函数结合**: ```kotlin fun <T, U> Pair<T, U>.swap() = Pair(second, first) val swapped = Pair("Kotlin", 3.7).swap() // 得到Pair(3.7, "Kotlin") ``` #### 典应用场景 1. **键值对容器**:如自定义`Pair`或`Triple`扩展 2. **多集合**:如`Result<T, E>`封装成功/错误 3. **跨模块数据转换**:利用实现安全的DTO转换[^4] 4. **函数式编程**:高阶函数中的多参数传递[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值