Kotlin中的型变:

1. in,顾名思义,就是只能作为传入参数的参数类型

2.out, ..............,就是只能作为返回类型参数的参数类型

星号投影:

我们引用官网的吧--

  • For Foo<out T>, where T is a covariant type parameter with the upper bound TUpper, Foo<*> is equivalent to Foo<out TUpper>. It means that when the T is unknown you can safely read values of TUpper from Foo<*>.

就是说返回参数类型可以不具体指定,用*号来引用上界即可,也就是我们用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 型变 + 星号投影(扯蛋)的更多相关文章

  1. SEO高手在扯蛋?

    真正的高手SEO你在扯蛋吗?当大家都很会扯的时候,高手扯得肯定比你疼,不是他们 蛋比较敏感,而是他们的确更用力. 当你说我是SEO时,高手肯定说现在我在做的是SEM. 当你说我是SEM时,高手肯定在说 ...

  2. scala 型变

    型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性. Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的. 在类型系统中使用型变允许我们在 ...

  3. Android之TextView密码输入变星号时间

    private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...

  4. Cocostudio学习笔记(1) 扯扯蛋 + 环境搭建

    转眼七月份就到了,2014已经过了一半,而我也最终算是有"一年工作经验"了,开心ing. 回想这一年Cocos2dx的游戏开发经历,去年下半年重心主要在游戏的逻辑上,而今年上半年重 ...

  5. Omi框架学习之旅 - 之开篇扯蛋

    说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...

  6. kotlin泛型中星号投射

    如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现 ...

  7. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  8. [虾扯蛋] android界面框架-Window

    从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...

  9. 扯蛋css

    使网页旋转代码: javascript:window.i=1;setInterval(function(){i++;document.body.style.cssText+="-webkit ...

随机推荐

  1. db2 reorg(转)

    DB2 reorg RUNSTATS: db2 connect to rmdb11 user rmadmin using rmadmin 对所有用户表执行runstats(reorgchk加updat ...

  2. ubuntu下hadoop0.20.2报错/dfs/name is in an inconsistent state

    Hadoop0.20.2在关机重启后,namenode启动报错: 用bin/hadoop namenode -format重新格式化一下就好了.这个问题已经出现了两次.每次都格式化,显然不是一个专业的 ...

  3. XDOJ 1046 - 高精度模板综合测试 - [高精度模板]

    题目链接:http://acm.xidian.edu.cn/problem.php?id=1046 题目描述 请输出两个数的和,差,积,商,取余.注意不要有前导零. 输入 多组数据,每组数据是两个整数 ...

  4. POJ 2299 Ultra-QuickSort 离散化加树状数组求逆序对

    http://poj.org/problem?id=2299 题意:求逆序对 题解:用树状数组.每读入一个数x,另a[x]=1.那么a数列的前缀和s[x]即为x前面(或者说,再x之前读入)小于x的个数 ...

  5. git commit -m 与 git commit -am的区别

    字面解释的话,git commit -m用于提交暂存区的文件:git commit -am用于提交跟踪过的文件 要理解它们的区别,首先要明白git的文件状态变化周期,如下图所示 工作目录下面的所有文件 ...

  6. webpack.DefinePlugin

    通过配置了DefinePlugin,那么这里面的标识就相当于全局变量,你的业务代码可以直接使用配置的标识.比如,你通过下面的设置: // webpack.config.js new webpack.D ...

  7. php之memcached存储session配置、存储、获取

    [session] ①.session.save_handler = memcache session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字,默认是files ② ...

  8. 过滤器会拦截 前端页面加载 js文件的请求

    学艺不精啊.....之前就总结过博客: JAVA中解决Filter过滤掉css,js,图片文件等问题 结果现在又犯了老错误~ 情况如下: index.jsp 页面的验证码输入栏绑定了异步验证(jQur ...

  9. spring根据name或者id获取实例

    @Resource(name="beanname") private ClassType scheduler; 其中ClassType需要跟实例的类型对应上.

  10. CF720A Closing ceremony 贪心

    正解:贪心 解题报告: 传送门! 先考虑如果只有一列怎么搞?那就肯定是尽量走到最远的地方 然后用点儿类似的思想,现在考虑有两列的情况QAQ 为了方便表述,这里给每个位置两个值,a表示离一号入口的距离, ...