返回顶部
首页 > 资讯 > 移动开发 >详解如何实现一个Kotlin函数类型
  • 601
分享到

详解如何实现一个Kotlin函数类型

实现Kotlin函数类型Kotlin函数类型Kotlin函数 2022-11-13 18:11:39 601人浏览 安东尼
摘要

目录接口与函数类型总结接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代码: interface Callb

接口与函数类型

业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代码:

interface Callback {
    fun response(): String
}

class Achieve: Callback {
    
    override fun response(): String {
        return ""
    }
}

这么写当然没什么毛病,甚至为了让Kotlin支持对接口CallbackSAM转换,你还可以在接口前面增加一个fun修饰:

fun interface Callback {
    fun response()
}

但是对于Kotlin而言,本身函数类型是可以被实现的,也就是说我们可以使用函数类型替换函数式接口,让子类去实现,代码如下:

class Achieve: () -> String {
    override fun invoke(): String {
        return ""
    }
}

这种实现函数类型的类需要重写的方法都是invoke(),方法返回值类型对应的就是函数类型的返回值类型。

这种写法我在LeakCanary源码中就看到了应用,比如监听Fragment是否销毁的类AndroidOFragmentDestroyWatcher

在这里写下我对这两种方式优缺点的比较:

1.函数类型相比较于接口去实现的优点如下:

参数类型更加直观

某个类实现了函数类型,能直观的看到这个函数类型需要传入的参数有哪些,是什么类型,返回值又是什么类型,而如果实现了一个接口,一般大家都习惯跳转到接口定义的地方看接口方法的实现,所以这一点函数类型会更加方便些

检索更方便

函数类型需要重写的方法名一定叫invoke,所以如果我需要看下某个实现类对重写方法的具体实现逻辑,直接在当前类中搜索invoke关键字定位到这个方法即可;而如果是一个接口接口,我得跳转到接口的定义的地方看接口方法名是什么,才能去实现类中去搜索,所以在这点上函数类型会更加方便些

2.函数类型相比较于接口去实现的缺点如下:

函数类型语义性会比较差:

毕竟定义的接口名一般是和业务进行绑定的,能大概知道这个接口是干啥用的,更加清晰直观,当然这个问题我们可以使用typealias解决,但就会失去上面参数类型更加直观的优点

多态性会比较差(自己编的,不知道合不合理)

比如如果定义的一个接口去实现,我们很容易实现下面这种功能:

fun test(achieve: Achieve) {
    if (achieve is Callback) {
        //实现某些逻辑
    }
}

而如果使用函数类型去实现这种逻辑:

看起来是不是很奇怪,而且对于很多需要重写的方法签名都是相同的(方法参数和返回值都是相同的),根本无法实现这种功能,具体的看下面一点的描述。

无法实现多个相同的函数类型

业务场景中也存在实现多个接口,并且接口定义的方法参数和返回值类型都是相同的,比如下面:

fun interface Callback {
    fun response(): String
}

fun interface Callback2 {
    fun response2(): String
}

class Achieve2: Callback, Callback2 {
    override fun response(): String {
        return ""
    }

    override fun response2(): String {
        return ""
    }
}

如果使用函数类型根本无法实现上面的这种多个接口实现的功能:

直接进行报错。

总结

不管是实现函数类型还是接口,两者都各有其优缺点,大家需要根据业务场景进行具体的选择

到此这篇关于详解如何实现一个Kotlin函数类型的文章就介绍到这了,更多相关Kotlin函数类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解如何实现一个Kotlin函数类型

本文链接: https://lsjlt.com/news/169279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解如何实现一个Kotlin函数类型
    目录接口与函数类型总结接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代码: interface Callb...
    99+
    2022-11-13
    实现Kotlin函数类型 Kotlin函数类型 Kotlin函数
  • Kotlin基本数据类型详解
    目录1. kotlin 数值型2. kotlin 布尔型3. kotlin 字符型4. kotlin 字符串5. kotlin 可空类型6. kotlin 类型相互转换7. kotl...
    99+
    2024-04-02
  • python函数如何返回一个对象类型
    python使用range函数返回对象类型,具体方法如下:range函数语法:range(start, stop[, step])range函数使用方法:print(range(10))range(0,10)...
    99+
    2024-04-02
  • 详解如何利用C++实现一个反射类
    目录正题开始Singleton.h反射类Reflex.h代码环境为VScode + CMake + GCC 8.1.0 首先,如何才能做到给我一个名字我就能拿到这个对象的这个值,也是...
    99+
    2023-03-09
    C++实现反射类 C++反射类
  • Kotlin 内联函数详解及实例
    Kotlin 内联函数详解及实例概述在说内联函数之前,先说说函数的调用过程。调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记...
    99+
    2023-05-31
    kotlin 内联函数
  • js如何实现一个isNaN函数
    这篇文章主要介绍了js如何实现一个isNaN函数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。自己实现一个 isNaN 函数这里利用了 NaN 值的一个特性,即 NaN 是整...
    99+
    2023-06-27
  • Golang如何实现一个不可复制类型
    这篇文章主要讲解了“Golang如何实现一个不可复制类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang如何实现一个不可复制类型”吧!如何复制一个对象不考虑IDE提供的代码分析和g...
    99+
    2023-07-05
  • Kotlin定义其他类的实现详解
    目录1.嵌套类2.数据类3.定义数据类的必须满足的条件4.解构声明5.枚举类enum class6.运算符重载1.嵌套类 如果一个类只对另外一个类有作用,那么可以将其嵌入到该类中,使...
    99+
    2024-04-02
  • Golang拾遗之实现一个不可复制类型详解
    目录如何复制一个对象为什么要禁止复制运行时检测实现禁止复制初步尝试更好的实现性能优点和缺点静态检测实现禁止复制利用Locker接口不可复制实现静态检测优点和缺点更进一步利用packa...
    99+
    2023-02-20
    Golang实现不可复制类型 Golang不可复制类型 Go 不可复制类型
  • TypeScript函数和类型断言实例详解
    目录开始断言非空断言类型断言尖括号as确定赋值断言类型守卫trpeofin函数可选参数默认值参数函数重载结束开始 现在要加速学习了,大佬们有没有内推,给个推荐 会vue2/vue3 ...
    99+
    2024-04-02
  • 详解C++函数类型与重载函数
    目录1.首先对重载函数,明确函数的返回类型不能决定重载函数的类别,即2.注意形参列表中的默认值,使用含默认参数的重载函数时可能会产生二义性。例:问题:总结 1.首先对重载函数,明确函...
    99+
    2024-04-02
  • PHP如何使用函数实现类型转换
    这篇文章主要介绍了PHP如何使用函数实现类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。转换函数转换通过intval() floatval() strval()三个转换...
    99+
    2023-06-17
  • 如何使用 Golang 函数类型实现回调?
    是的,在 go 中可以使用函数类型实现回调功能,具体步骤如下:声明一个函数类型,指定回调函数的签名。定义一个接受函数类型作为参数的函数。将需要回调的函数传递给该函数。 使用 Golan...
    99+
    2024-04-22
    golang 回调
  • 使用TypeScript实现一个类型安全的EventBus示例详解
    目录前言准备工作目标思路具体实现全部代码后记前言 随着vue3的发布,TypeScript在国内越来越流行,学习TypeScript也随即变成了大势所趋。本文就通过实现一个类型安全的...
    99+
    2024-04-02
  • 使用Kotlin如何实现开发一个Android应用
    今天就跟大家聊聊有关使用Kotlin如何实现开发一个Android应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。配置项目gradle文件apply plugin: 'co...
    99+
    2023-05-31
    kotlin android roi
  • 如何在Kotlin中实现定义包和函数
    这期内容当中小编将会给大家带来有关如何在Kotlin中实现定义包和函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。包名的定义在xxx.kt文件的顶部进行定义,使用package关键字,定义后,引用包内函...
    99+
    2023-05-31
    kotlin 函数
  • 如何在Java中实现一个大数类
    如何在Java中实现一个大数类?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java中的大数类简单实现Java中的大数还是挺好用,而且很方便,所以将其罗列如下,...
    99+
    2023-05-31
    java 大数类 ava
  • PHP 函数参数类型严格检查如何实现?
    php 函数参数类型严格检查可以确保传递的参数与声明的类型一致。通过 declare(strict_types=1) 启用后,函数参数要求匹配指定类型,否则抛出 typeerror 异常...
    99+
    2024-04-10
    php 类型检查
  • PHP 函数参数类型重载是如何实现的?
    php不支持函数重载,但可通过技巧实现类似效果:定义具有相同名称的多个函数,每个函数接受不同类型或数量的参数。在函数调用时,根据参数的类型和数量,使用反射机制确定要调用的函数。该技巧可提...
    99+
    2024-04-10
    php 函数重载 代码可读性
  • 如何使用TypeScript实现一个类型安全的EventBus
    这篇文章主要介绍“如何使用TypeScript实现一个类型安全的EventBus”,在日常操作中,相信很多人在如何使用TypeScript实现一个类型安全的EventBus问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作