在上一次https://www.cnblogs.com/webor2006/p/11294849.html中对于Java的协变和Kotlin的协变提到了它们的区别,回忆一下:

其实在Kotlin中也有使用处协变(use-site variance),也叫(type projection类型投影),我们知道当一个类的泛型声明为out之后,所有用到该泛型的只能做为返回类型,而实际场景肯定不能完全满足这一点,所以说如果在泛型中还想达到子类的对象赋值给父类型,那么就不能在声明处声明为out了,此时使用式的协变就可以解决此场景,下面先来看一下Kotlin的Array的定义,接下来的例子会使用它:

接下来定义一个方法:

接下来则使用一下,先来构造一个from:

接下来to的生成采用直接构造的方式,先来看一下Array的构造方法:

那怎么构造呢?如下:

其实构造的Lamda表达式有更精简的写法:

其实还有另一种写法,就是说如果每一个元素的值都初始化一样的,那么可以这样写:

好,接下来就来调用copy函数:

下面假设这个赋值是能成立的,那,是不是说我可以这样写:

但是!!!问题来了,如果我们从中取元素时,那就跪了,我不知道它具体是Int还是String还是其它类型,所以这种情况就乱套了,所以应该禁止程序员来对它进行写操作,那么协变的威力就发挥作用了,另外从实际角度来考虑很显然这个赋值预期应该是能被赋值成功的,接下来使用处协变就可以发挥作用啦,也是使用out,如下:

擦!!这不就是声明式的协变么?注意!!!不是哈~~声明式的协变长啥样,回忆一下:

而咱们目前使用的使用处协变是在一个具体类型上使用了out,如下:

这样就代表:

如果写的话就会报错:

这也是协变的意义所在,接下来再来看一下使用处逆变的例子:

接下来继续修改,引出逆变:

所以,使用处逆变修改为:

其能成功的原因其实跟上节分析的逆变是一样的,最终原因还得归功于多态,如下:

因为in只会保证写,而不能读,如果读的话肯定就会出问题。

Kotlin使用处协变的意义与用法的更多相关文章

  1. 详解C++中命名空间的意义和用法

    看过鸡啄米的C++编程入门系列教程的朋友,应该能注意到,在其中的很多实例中,都有这么一条语句:using namespace std;,即使用命名空间std,其作用就是规定该文件中使用的标准库函数都是 ...

  2. duilib各种布局的作用,相对布局与绝对布局的的意义与用法

    大多数刚使用duilib的朋友时候非常依赖duilib自带的设计器,用他可以拖拉控件,可视化的做出自己想要的界面.可是用一段时间就会发现原带的设计器有很多bug,时不时会崩溃,支持的控件数量有限,属性 ...

  3. EOF的意义及用法

    c/c++ 中EOF的意义及用法 EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束. 在微软的DOS和Windows中,读取数据时终端不会产生EOF.此时,应用程序知道数 ...

  4. jni中arm64-v8a,armeabi-v7a,armeabi文件夹的意义和用法<转>

    jni中arm64-v8a,armeabi-v7a,armeabi文件夹的意义和用法 起因 之前并没有关注这块,直到:您的应用被拒绝,原因:xplay5sQ心里点击笑值点击拍照显示停止运行,查看发过来 ...

  5. java中异常(Exception)的定义,意义和用法。举例

    1.异常(Exception)的定义,意义和用法 我们先给出一个例子,看看异常有什么用? 例:1.1- public class Test {    public static void main(S ...

  6. Kotlin泛型与协变及逆变原理剖析

    在上一次https://www.cnblogs.com/webor2006/p/11234941.html中学习了数据类[data class]相关的知识,这次会学习关于泛型相关的东东,其中有关于泛型 ...

  7. Kotlin 匿名内部类对象引用当前Activity的this用法

    一,Kotlin中匿名内部类,引用Activity的this用法为 this@MainActivity (对应自己的Activity),还是上代码吧 class Main17Activity : Ap ...

  8. 转载:java 中对类中的属性使用set/get方法的意义和用法

    经常看到有朋友提到类似:对类中的属性使用set/get方法的作用?理论的回答当然是封闭性之类的,但是这样对我们有什么作用呢?为什么要这样设计?我直接使用属性名来访问不是更直接,代码更简洁明了吗?下面我 ...

  9. do{...}while(0)的意义和用法

    linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢? 实际上,do{. ...

随机推荐

  1. [LeetCode] 217. Contains Duplicate 包含重复元素

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  2. [LeetCode] 752. Open the Lock 开锁

    You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...

  3. GenericObjectPool

    commons-pool2源码走读(四) 对象池实现GenericObjectPool 2018年05月27日 18:24:56 蓝墨49 阅读数 1787   版权声明:本文为博主原创文章,遵循CC ...

  4. 【视频开发】关于FFMPEG中内存泄漏的问题之av_bitstream_filter_filter

    How may I free pkt in an ffmpeg write frame method Rate this:      See more: C++ ffmpeg Greetings I' ...

  5. ddl语法

    创建表: create table 表名 ( 字段1 varchar2(32) not null primary key, 字段2 date not null ) tablespace 表空间名 事务 ...

  6. JAVA代码:生成一个集合,自定义大小,100以内的随机整数

    JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...

  7. Apache Kafka Connect - 2019完整指南

    今天,我们将讨论Apache Kafka Connect.此Kafka Connect文章包含有关Kafka Connector类型的信息,Kafka Connect的功能和限制.此外,我们将了解Ka ...

  8. 为什么Apache Kafka如此受欢迎

    1.目标 今天,在这个Kafka教程中,我们将学习所有Kafka功能,如可扩展性,可靠性,耐用性,这些都说明了Kafka如此受欢迎的原因.我们将详细讨论Kafka的每个功能.但在那之前让我们明白什么是 ...

  9. JVM之java并发 ——线程安全与锁优化

    概述 人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情.有时候,良好的设计原则不得不向现实 ...

  10. Java开发笔记(一百一十六)采用UDP协议的Socket通信

    前面介绍了如何通过Socket接口传输文本与文件,在示例代码中,Socket客户端得先调用connect方法连接服务端,确认双方成功连上后才能继续运行后面的代码,这种确认机制确保客户端与服务端的的确确 ...