Kotlin泛型的匿名扩展函数的扩展函数

这篇文章是在Kotlin协程的时候思考写下的。

在Kotlin中,创建一个协程,需要调用createCoroutine函数,有两个函数叫这个名字,其中之一函数的声明是这样的。

public fun <R, T> (suspend R.() -> T).createCoroutine(
    receiver: R,
    completion: Continuation<T>
): Continuation<Unit> = SafeContinuation(createCoroutineUnchecked(receiver, completion), COROUTINE_SUSPENDED)

我们注意到 createCoroutine 是一个扩展函数,谁的扩展函数呢?suspend R.()->T 这个匿名函数的扩展函数。

很神奇,为什么一个函数能有扩展函数呢?
因为Kotlin中的匿名函数实际上也就是一个类,所以匿名函数当然可以有扩展函

在这里插入图片描述

所以这样写是完全没问题的,但是调用的位置就要注意了,必须是函数对象才能调用,下面的写法就无法调用到test1函数。

在这里插入图片描述
只能把函数转变为对象才可以调用
在这里插入图片描述
然后我们进入下一个问题,泛型的扩展函数的扩展函数是什么东西,我们把test1函数改一下,

fun  <T> (T.() -> Unit).test1(): Unit {

}

这样,我们应该怎么调用这个函数呢,逆向思考,只有函数对象才能有扩展函数,那么T.()->Unit就应该是一个函数对象,而::doFunction就是一个对象啊,我们试一下。
在这里插入图片描述

果然没问题。但是泛型并没有发挥作用,因为doFunction函数是在调用的位置,才由函数转化为对象的,在doFuncion还是一个函数的时候,并不知道它会变成谁的匿名函数,所以完全跟泛型不搭边了,那这个位置加个泛型到底由什么用呢?往下分析。

扩展函数有一个重要的属性,就是可以调用到其Reciver类中对外公开的属性和方法。给扩展函数加一个泛型,就是为了调用到泛型内部的公开属性和方法。
我们换个写法,模仿一下KT的协程里面场景。

先写个接口,模仿KT协程里面的 Coroutine类
在这里插入图片描述
再写个类,模拟协程调用的位置
在这里插入图片描述
我们发现,有泛型的方法,可以获取到一个this。 因为上一个Demo中doFunction不是一个匿名函数,且本来就是MainActivity类的成员,所以即使不把扩展函数成泛型写法,也可以获取到MainActivity的成员,所以看不出来差别。
但是在下面这个Demo中,由于block函数成为了泛型T ,也就是TestInterface的扩展函数,所以可以调用到TestInterface的这个This,而没有泛型的方法则无法调用到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
其基础编译器(他们将其改为kompiler——开创了一系列以K字打头的用语——甚至连 contributors这类词他们也用改成了kontributors)可以被独立出来并嵌入到 Maven、Ant 或 Gradle 工具链中。这使得在 IDE 中开发的代码能够利用已有的机制来构建,从而尽可能的减少了在新环境中使用所受的干预,哪怕与那些没有安装 Kotlin 插件的开发人员一起合作项目也没有问题。 The IntelliJ Kotlin 插件扩展了 Java 编译器使得 Kotlin 代码能够得以编写、编译和调试。除此之外,关于基本的 Java 集合,已经有编写好的帮助函数,可以更顺畅地衔接将在 Java 8 中出现的集合扩展。 有两篇文章对 Kotlin 与 Java 以及 Kotlin 与 Scala 分别进行了比较,对各自特性和异同进行了对比。即便 Scala 可能还是更为强大些,Kotlin 还是尝试着提供比 Java 更好的函数、模式匹配、空指针预防和泛型。该语言同时也支持特征(traits)和模式匹配。 Kotlin 插件在当前版本的 IntelliJ 和 Eclipse 中均已能使用。 [4] Kotlin,类似 Xtend 一样,旨在提供一种更好的 Java 而非重建整个新平台。这两种语言都向下编译为字节码(虽然 Xtend 是首先转换成相应的 Java 代码,再让 Java 编译器完成繁重的工作),而且两者都引入了函数扩展函数(在某个有限范围内静态地增加一个新方法到某个已有类型的能力)。Xtend 是基于 Eclipse 的,而 Kotlin 是基于 IntelliJ 的,两者都提供无界面构建。能够首先演变到其他 IDE 的语言有可能成为最后的赢家。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值