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. JavaScript外部函数调用AngularJS的函数、$scope

    x 场景: 需要在用FusionCharts画的柱状图中添加点击事件,But弹出框是Angularjs搞的,我想的是直接跳到弹出框的那个路由里,然后在弹出框的控制器中绑定数据即可: /* 点击事件 * ...

  2. .NET Core开发日志——Peachpie

    .NET Core的生态圈随着开源社区的力量不断注入至其中,正在变得越来越强盛,并且不时得就出现些有意思的项目,比如Peachpie,它使得PHP的代码迁移到.NET Core项目变得可能. 从创建简 ...

  3. You are using pip version 9.0.1, however version 18.0 is available. You should consider upgrading via the 'pip install --upgrade pip' command.

    实测使用pip3进行一些软件安装的时候,会弹出这个,记住不要理会,一旦你执行,就会升级pip,并冲突pip3造成pip3不能用,这时候就要重新安装一下python3

  4. POJ 1102 - LC-Display

    Description A friend of you has just bought a new computer. Until now, the most powerful computer he ...

  5. 【每日一题】 uva-232 模拟+输出要求很严格

    https://cn.vjudge.net/problem/UVA-232 uva的题,结尾不能多\n,空格什么的 反正就是个中型模拟,题目多读就行 #define _CRT_SECURE_NO_WA ...

  6. H. GSS and Simple Math Problem 高精度乘法模板

    链接:https://www.nowcoder.com/acm/contest/104/G来源:牛客网 题目描述 Given n positive integers , your task is to ...

  7. winform 科学计数法转为小数

    先强制转换为decimal. 例如: double xyTolerance = 0.000000008983001; txtXYTolerance.Text = ((decimal)xyToleran ...

  8. JS之JSON.parse和JSON.stringify

    这两个函数有兼容性问题, 会报错JSON"未定义 解决方案, 引入json2.js,可以解决浏览器的兼容性 https://link.jianshu.com/?t=https://githu ...

  9. 介绍一款jquery ui组件gijgo(含tree树状结构、grid表格),特点:简易、文档全清晰易懂、示例代码

    http://gijgo.com   gijgo组件 特点:简易.文档全-虽然是英文的但是清晰易懂可读性强.含示例代码(后端直接用原生.Net C# MVC的哦!非常合.Net开发胃口),网站网速快, ...

  10. iOS中的静态库与动态库,区别、制作和使用

    如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...