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. 单链表实现n(n≥20)的阶乘

    n(n≥20)的阶乘 基本要求 数据的表示和存储: 累积运算的中间结果和最终的计算结果的数据类型要求是整型--这是问题本身的要求. 试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值. 数 ...

  2. 挖矿程序的工作原理(BTC为例)

    Mining时代进化:CPU挖矿 -> GPU挖矿 -> FPGA挖矿 -> ASIC挖矿CPU挖矿时代:SENGENERATEGPU挖矿时代:GETWORK Miner:挖矿的程序 ...

  3. ArcGIS API for JavaScript

    以3.14版本为例: 1.部署环境: 下载:https://developers.arcgis.com/downloads/apis-and-sdks?product=javascript# 部署:h ...

  4. iOS 限制输入字数

    关于限制输入字数以前也做过,网上也很多方法.但都不够完美,本方法可防止中文联想.粘贴等突破长途限制.可防止Emoji截为两半导致编码出问题. - (void)textFieldDidChange:(U ...

  5. Flash and Scalform CLIK

    Flash shift + f7 打开组件检查面板 Scaleform As bit define bool                Unrolling       :1;    // indi ...

  6. 转:Java 异常结构体系

    原文地址:Java 异常结构体系 保存一份资料 前几天在参加网易和360公司的在线考试的时候,都出了一道关于java中异常类的多项选择题.这几天翻看了相关书籍和网上一些资料,结合自己的理解与思考,将自 ...

  7. LeetCode 561 Array Partition I 解题报告

    题目要求 Given an array of 2n integers, your task is to group these integers into n pairs of integer, sa ...

  8. redis哨兵模式,数据尽量少的丢失

    min-slave-to-write 1 ->至少要有1个从节点 min-slaves-max-lag 10   ->超过10秒如果数据不能同步则拒绝新的写请求

  9. cmd远程连接oracle

    sqlplus 用户名/密码@IP:端口号/oracle实例

  10. oracle用户被锁

    使用PLSQL客户端:1.用管理员账户登录PLSQL Developer(登录名可以为system,选择类型的时候把Normal修改为Sysdba).2.左侧选择My Objects,查看Users文 ...