Kotlin 型变 + 星号投影(扯蛋)
Kotlin中的型变:
1. in,顾名思义,就是只能作为传入参数的参数类型
2.out, ..............,就是只能作为返回类型参数的参数类型
星号投影:
我们引用官网的吧--
- For
Foo<out T>, whereTis a covariant type parameter with the upper boundTUpper,Foo<*>is equivalent toFoo<out TUpper>. It means that when theTis unknown you can safely read values ofTUpperfromFoo<*>.
就是说返回参数类型可以不具体指定,用*号来引用上界即可,也就是我们用Any类型就行,它的含义Foo<*>=Foo<out Any>
好吧,我给个例子,里边有型变和投影,型变的概念是确定无疑,但是星号投影就是扯蛋,kotlin说了"我们还不成熟"
// 1
我们老老实实的写写
interface MyIfe<out C, in D> {
fun MyFun(d: D) {
println(d)
}
}
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<Any,Int> {
init {
println(b)
}
fun foo():A {
return a
}
}
fun main(args: Array<String>) {
val res = MyClsEx<Any,Int>("Any", 13)
println("${res.a}+b refering to ahead")
res.MyFun(1)
}
result:
Any+b refering to ahead
1
Ok, 没问题
// 2
我们用上星号投影吧
interface MyIfe<out C, in D> {
fun MyFun(d: D) {
println(d)
}
}
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<*,Int> {
init {
println(b)
}
fun foo():A {
return a
}
}
fun main(args: Array<String>) {
val res = MyClsEx<Any,Int>("Any", 13)
println("${res.a}+b refering to ahead")
res.MyFun(1)
}
//编译就错误
error: projections are not allowed for immediate arguments of a supertype
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<*,Int> {
扯蛋第一步产生了,这个星号根本不能用嘛
// 3
怎么办呢?
看看官网,For example, if the type is declared as interface Function<in T, out U> we can imagine the following star-projections
其中interface Function让我想到----“可能在泛型函数中能实现星号投影”
所以
interface MyIfe {
fun <out C, in D> MyFun(d: D) {
println(d)
}
}
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe {
init {
println(b)
}
fun foo():A {
return a
}
}
//编译也错误
error: projections are not allowed for immediate arguments of a supertype
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<*,Int> {
//结论
泛型三大类别,(类,接口)和函数全都不能星号投影,那么你认为还能投影吗?
我认为不能
Finally:
但我就是对Kotlin有信心,就是这么固执,乍办呢!
哈哈哈
Kotlin 型变 + 星号投影(扯蛋)的更多相关文章
- SEO高手在扯蛋?
真正的高手SEO你在扯蛋吗?当大家都很会扯的时候,高手扯得肯定比你疼,不是他们 蛋比较敏感,而是他们的确更用力. 当你说我是SEO时,高手肯定说现在我在做的是SEM. 当你说我是SEM时,高手肯定在说 ...
- scala 型变
型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性. Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的. 在类型系统中使用型变允许我们在 ...
- Android之TextView密码输入变星号时间
private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...
- Cocostudio学习笔记(1) 扯扯蛋 + 环境搭建
转眼七月份就到了,2014已经过了一半,而我也最终算是有"一年工作经验"了,开心ing. 回想这一年Cocos2dx的游戏开发经历,去年下半年重心主要在游戏的逻辑上,而今年上半年重 ...
- Omi框架学习之旅 - 之开篇扯蛋
说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...
- kotlin泛型中星号投射
如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现 ...
- 虾扯蛋:Android View动画 Animation不完全解析
本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...
- [虾扯蛋] android界面框架-Window
从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...
- 扯蛋css
使网页旋转代码: javascript:window.i=1;setInterval(function(){i++;document.body.style.cssText+="-webkit ...
随机推荐
- win server 2008添加磁盘-脱机转换为联机状态方法
解决方案如下: 1.运行:cmd2.输入:DISKPART3.DISKPART> san4.DISKPART> san policy=onlineall5.DISKPART>list ...
- monit安装配置
环境centos5(32bit),monit-5.17.1,下载地址 https://bitbucket.org/tildeslash/monit/downloads/ 1.tar zxvf moni ...
- Flink -- Keyed State
/* <pre>{@code * DataStream<MyType> stream = ...; * KeyedStream<MyType> keyedStrea ...
- Fmod使用总结
1.查询相关文档的地址 http://www.fmod.org/forum/viewtopic.php?f=7&t=15762
- 上传本地代码到github&&从github下载源码
最近在玩github,下面简单介绍下githup的使用 将本地代码同步到github. 使用Git GUI同步 1,先下载git,然后安装.右键如图所示. 2,在github里新建一个 reposi ...
- day3_字符串常用方法
s.upper()s.lower()s.capitalize()s.split(',')s.strip('abc')s.lstrip()s.rstrip()s.replace('old','new') ...
- PLSQL游标
静态游标:结果集已经确实(静态定义)的游标.分为隐式和显式游标 隐式游标:所有DML语句为隐式游标,通过隐式游标属性可以获取SQL语句信息: 显式游标:用户显式声明的游标,即指定结果集.当查询返回结果 ...
- base64简单使用
加密: import base64 import random str ="aqwertyuiopasdfghjklzxcvbnm963.0852741,.;'" a = '人生苦 ...
- CloudStack+KVM环境搭建(步骤很详细,说明ClockStack是用来管理虚拟机的)
文章目录环境准备配置本地域名解析关闭selinux安装ntp服务安装管理端安装Mysql数据库安装服务端RPM:初始化CloudStack数据库:初始化cloudstack管理服务器安装系统虚拟机安装 ...
- vue router拦截器的简单使用
之前,为了实现router跳转的每个页面的url上都带上addressCode,然后用了一下router拦截器,很好用,当然也可以专门封装一个方法来实现(跳转的页面上带有addressCode),不过 ...