美文网首页
Kotlin 泛型 out in的示例

Kotlin 泛型 out in的示例

作者: sampson666888 | 来源:发表于2023-09-25 13:14 被阅读0次

当涉及到协变和逆变时,Kotlin 的 out 和 in 关键字可以提供更精确的类型约束。下面是一些在 Kotlin 中使用 out 和 in 的示例:

1.协变(out)示例:
open class Animal(val name: String)
class Cat(name: String) : Animal(name)
class Dog(name: String) : Animal(name)

interface AnimalProducer<out T> {
    fun produce(): T
}

fun main() {
    val catProducer: AnimalProducer<Cat> = object : AnimalProducer<Cat> {
        override fun produce(): Cat {
            return Cat("Whiskers")
        }
    }

    val animalProducer: AnimalProducer<Animal> = catProducer // 协变,Cat 是 Animal 的子类型

    val animal: Animal = animalProducer.produce() // 可以生产 Animal
    println(animal.name) // 输出 "Whiskers"
    val cat: Cat = catProducer.produce() // 可以生产 Cat
    println(cat.name) // 输出 "Whiskers"
}

在上述示例中,AnimalProducer<out T> 接口使用了 out 关键字来声明 T 为协变类型参数。这意味着 AnimalProducer<Cat> 是 AnimalProducer<Animal> 的子类型,因为 Cat 是 Animal 的子类型。

2.逆变(in)示例:
open class Animal(val name: String)
class Cat(name: String) : Animal(name)
class Dog(name: String) : Animal(name)

interface AnimalConsumer<in T> {
    fun consume(animal: T)
}

fun main() {
    val animalConsumer: AnimalConsumer<Animal> = object : AnimalConsumer<Animal> {
        override fun consume(animal: Animal) {
            println("Consuming animal: ${animal.name}")
        }
    }

    val catConsumer: AnimalConsumer<Cat> = animalConsumer

    animalConsumer.consume(Animal("Animal")) // 可以消费 Animal
    animalConsumer.consume(Cat("Whiskers")) // 可以消费 Cat

    catConsumer.consume(Animal("Animal")) // 会报错 仅可以消费 Cat
    catConsumer.consume(Cat("Whiskers")) // 仅可以消费 Cat
}

在上述示例中,AnimalConsumer<in T> 接口使用了 in 关键字来声明 T 为逆变类型参数。这意味着 AnimalConsumer<Cat> 是 AnimalConsumer<Animal> 的子类型,因为 AnimalConsumer<Animal> 可以接受 Animal 或其子类型作为输入。我们可以使用 animalConsumer 对象消费 Cat 对象或 Animal 对象,但 catConsumer 对象只能消费 Cat 对象。

以上示例演示了在 Kotlin 中使用 out 和 in 关键字来实现泛型的协变和逆变,从而提供更精确的类型约束。

相关文章

  • Kotlin Weekly 中文周报 —— 23

    Kotlin 开发中文周报 文章 Kotlin 泛型『in』和『out』的变体(android.jlelse.eu...

  • kotlin 泛型 :out in

    * in。它使得一个类型参数逆变:只可以被写入而不可以被读取(相当于Java中 ? super T) * out ...

  • Kotlin开发知识(一)

    1.Kotlin泛型使用 Out(协变) 如果你的类是将泛型作为内部方法的返回,那么可以用out。可以称其为pro...

  • Kotlin-泛型

    源自:码上开学-Kotlin的泛型 kotlin的in和out对应的是java中带上界和下界的通配符?号。【in】...

  • Java泛型通配符,上下界。

    为了理清楚泛型的通配符和上下界的作用,并为了Kotlin的泛型中的关键字in和out的理解,在此用小demo重新梳...

  • Kotlin(1.1)学习笔记(6)——泛型

    in和out 和java一样,kotlin中也有泛型的概念。不同的是,java中使用了通配符而kotlin中不存在...

  • 泛型

    与Java泛型相同,Kotlin同样提供了泛型支持。对于简单的泛型类、泛型函数的定义,Kotlin 与 Java ...

  • Kotlin---泛型

    Kotlin不变型泛型 Kotlin的不变型泛型和Java一样,通过声明泛型类型来使用泛型类。而该种泛型声明后,则...

  • 网址笔记记录

    1.Kotlin 泛型中的 in 和 out https://www.jianshu.com/p/c5ef8b30...

  • Kotlin 泛型 VS Java 泛型

    建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言...

网友评论

      本文标题:Kotlin 泛型 out in的示例

      本文链接:https://www.haomeiwen.com/subject/kwgqbdtx.html