n怎样建立自己的网站,旅游景点网站模板大全,html简单登录界面代码,长宁免费网站制作在Kotlin中#xff0c;协变和逆变是泛型编程中的两个重要概念#xff0c;它们允许我们在类型系统中更加灵活地处理类型关系。 1.协变#xff1a;协变允许我们使用比原始类型更具体的类型。在kotlin中#xff0c;通过在类型参数上加out关键字来表示协变,生产者#xff0c;例…在Kotlin中协变和逆变是泛型编程中的两个重要概念它们允许我们在类型系统中更加灵活地处理类型关系。 1.协变协变允许我们使用比原始类型更具体的类型。在kotlin中通过在类型参数上加out关键字来表示协变,生产者例如如果我们有一个泛型类List其中T是一个协变类型参数那么我们可以将List赋值给List因为String是Any的子类型。
2.逆变逆变允许我们使用比原始类型更一般的类型。在kotlin中通过在类型参数上加in关键字来表示逆变消费者例如如果我们有一个泛型函数fun foo(list: List)其中T是一个逆变类型参数那么我们可以将List传递给foo函数因为Any是String的超类型。
协变代码举例
interface Producerout T {//协变 out 类似java中的 extendfun produce(): T
}
open class Fruit
open class Apple: Fruit()class FruitProducer:ProducerFruit {override fun produce(): Fruit {return Fruit()}
}class AppleProducer:ProducerApple {override fun produce(): Apple {return Apple()}
}fun T processProduce(producer:ProducerT) {val product producer.produce()println(product)
}fun main(){var fruitProducer:ProducerFruit FruitProducer()var appleProducer:ProducerApple AppleProducer()processProduce(fruitProducer)processProduce(appleProducer)
// appleProducer fruitProducer //报错协变不允许将ProducerFruit赋值给ProducerApple
// fruitProducer appleProducer //协变允许将ProducerApple赋值给ProducerFruit}逆变代码举例
interface Consumerin T{ //逆变 in 类似java中的superfun consume()
}class FruitConsumer:ConsumerFruit{override fun consume() {println(consume fruit)}
}class AppleConsumer:ConsumerApple{override fun consume() {println(consume apple)}
}inline fun T processConsumer(consumer:ConsumerT){consumer.consume()
}fun main() {var fruitConsumer:ConsumerFruit FruitConsumer()var appleConsumer:ConsumerApple AppleConsumer()processConsumer(fruitConsumer)processConsumer(appleConsumer)
// fruitConsumer appleConsumer //报错逆变不允许将ConsumerApple赋值给ConsumerFruit
// appleConsumer fruitConsumer //允许将ConsumerFruit赋值给ConsumerApple,}