星投影(star projection):

继续来学习Kotlin泛型相关的东东,星投影(star projection),这是个啥东东呢?下面先来说一下概念:

1、对于Star<out T>协变:如果T的上界是TUpper,那么Star<*>就相当于Star<out T>,这表示当T的类型未知时,你可以安全地读取TUpper类型的值,言外之意就是从Star<*>取出来的元素都会当成TUpper类型。

2、对于Star<in T>逆变:Star<*>就相当于Star<in Nothing>,其中Nothing的类定义为:

这就表示你无法向其中写入任何值。

3、对于Star<T>不变:如果T的上界为TUpper,那么Star<*>就相当于读取时的Star<out TUpper>以及写入时的Star<in Nothing>。

了解了概念之后,下面来看具体的实例,先来看第一条:

接着再来看第二条:

接下来看代码:

这段代码能编译通过么?打开注释就知道了:

其实原因就是如前面第二条理论所说:

接下来再定义第三点的实例:

其能正常读取的原因是根据第三点的理论:

但是不能写入,因为:

试试:

果真如此,接下来再来举个例子:

好,接下来改一下:

其实就是第三点所说,我们看一下MutableList的泛型定义就知道了:

泛型约束: 

再来看一下关于协变跟逆变相关的东东:

而如果这样:

但是!!在某些实际情况下可能不得已要能将它作为参数进行写入,那怎么打破这个规则呢?其实Kotlin给咱们提供了一个注解能打破此规则,如下:

咱们看一下该注解的解释:

也就意味着,通过该注解告诉使用者这样使用是有安全隐患的,后果自负,下面来使用一下它:

接下来再继续:

myStorage2是指向Int类型的myStorage1,而居然往myStorage2中写入了一个字符串,这不是违背常理么?其实原因是泛型擦除所决定的,我们在代码中声明的任何类型类型其实到了字节码当中都会不成Object类型,也就是泛型在字节码的层面类型信息就被擦除了,而当我们从泛型来读取时则会强制进行类型转换,回到咱们的程序,当在执行myStorage2.getValue()时,其实最终会强制转换成Any类型,所以程序也没毛病。

泛型函数:

这个在Java中也存在,下面直接看下代码:

下面来使用一下:

其实还可以类型推断简化一下:

对于泛型,如果想约束只能是所声明的类型及以下的类型,那该怎么约束呢,比如:

很显然该类型是一个不变类型,而如果要要求我们传的类型有上界,则需要这样声明:

目前这种声明是只支持一种上限,而有时候可能会有多个上界类型,那在Kotlin是如何声明的呢?

很显然String既是Comparable和Any的子类型,其实Any的声明是可以去掉的,如下:

但是这是为了演示泛型可以声明多个上限有意为之的。

Kotlin星投影与泛型约束详解的更多相关文章

  1. 1_03_MSSQL课程_约束详解

    复习: ->创建数据库的SQL:******** create database 数据库名 on ( name=‘’, size=5MB, filegrowth=2MB, filename=&q ...

  2. .NETCore 千星项目模块化开发框架 SimplCommerce 详解

    SimplCommerce 是 github 上过千星的.netcore 商城示例项目,本文详解他的模块化框架现实思路,其业务(如产品.订单)不作介绍.因作者文笔水平很差,它又很值得学习和推荐,就算不 ...

  3. Kotlin协程作用域与Job详解

    Job详解: 在上一次https://www.cnblogs.com/webor2006/p/11725866.html中抛出了一个问题: 所以咱们将delay去掉,需要改造一下,先把主线程的dela ...

  4. [转]地理投影,常用坐标系详解、WGS84、WGS84 Web墨卡托、WGS84 UTM、北京54坐标系、西安80坐标系、CGCS2000坐标系

    转自:http://www.rivermap.cn/docs/show-1829.html 常用坐标系详解 (一)WGS84坐标系 WGS-84坐标系(World Geodetic System一19 ...

  5. java 泛型实例详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) 2013-02-04 19:49:49| 分类: JAVA | 标签:java |举报|字号 订阅 下载LOFTER客户端 JDK1.5 令我们期 ...

  6. C#泛型实例详解

    本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下: 首先需要明白什么时候使用泛型: 当针对不同的数据类型,采用相似的逻辑算法,为了避免重复,可以考虑使用泛型. 一.针 ...

  7. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  8. [poj 3159]Candies[差分约束详解][朴素的考虑法]

    题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...

  9. Java中泛型区别以及泛型擦除详解

    一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种 ...

随机推荐

  1. [LeetCode] 195. Tenth Line 第十行

    Given a text file file.txt, print just the 10th line of the file. Example: Assume that file.txt has ...

  2. chrome/firefox如何设置很色背景

    firefox 菜单栏设置黑色 自带黑色主题,直接Enabled 页面背景设置黑色 下载扩展Extensions:Dark Reader chrome 菜单栏设置黑色 下载主题Theme:Just b ...

  3. PCL贪婪投影三角化算法

    贪婪投影三角化算法是一种对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复. 方法: (1)将三维点通过法线投影到某一平面 (2)对投影得 ...

  4. mysql创建用户并授权Repl_slave_priv和Repl_client_priv

    CREATE USER 'test'@'localhost' IDENTIFIED BY 'test'; FLUSH PRIVILEGES; GRANT REPLICATION CLIENT ON * ...

  5. 【转帖】MySQL用得好好的,为什么要转ES?

    MySQL用得好好的,为什么要转ES? http://developer.51cto.com/art/201911/605288.htm Elasticsearch作为一款功能强大的分布式搜索引擎,支 ...

  6. Kafka Broker | 命令行选项和过程

    1.目标 在这个Apache Kafka教程中,我们将学习Kafka Broker.Kafka Broker管理主题中的消息存储.如果Apache Kafka有多个代理,那就是我们所说的Kafka集群 ...

  7. Java基础笔试练习(十一)

    1.下面的方法,当输入为2的时候返回值是多少? public static int getValue(int i) { int result = 0; switch (i) { case 1: res ...

  8. handy网络库源码阅读

    简洁易用的C++11网络库,From:https://github.com/yedf/handy 在整理过去的资料过程中,发现过去有关注过这一个网络库,简单看了一下属于轻量级的实现,因此本文将对该库进 ...

  9. JMeter中文乱码的解决

    对于JMeter中文乱码分为两部分: 1.请求(request):由于引用了csv文件当csv文件编码与JMeter不统一可能造成服务器收到数据的中文乱码 2.返回(response):由于服务器返回 ...

  10. mysql_重置密码

    # 修改编码 ```pythonshow variables like '%char%'; #查看当前使用的编码 1.打开配置文件: vim /etc/mysql/my.cnf 2.在[client] ...