Kotlin学习之双冒号

Posted 安卓小小鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin学习之双冒号相关的知识,希望对你有一定的参考价值。

Kotlin学习之双冒号

最新在复习kotlin相关的知识,看到一个平时不注意的点,就是::的使用,平时开发使用都是IDE提示,顺手一改,今天复习看到了这个知识点,就顺手复习记录一下

::定义

Kotlin 中 双冒号操作符 表示把一个方法当做一个参数 ,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。先来看一下例子:

object KotlinLearn 
   @JvmStatic
   fun main(args: Array<String>) 
       val testInstance = Test()
       print(lock("a","m", ::getResult))
       print(lock("a","m", testInstance::test))
   
   
   fun getResult(str1: String, str2: String): String = "result is $str1 , $str2"
   fun lock(p1: String, p2: String, method: (str1: String, str2: String) -> String): String 
       return method(p1, p2)
   
   fun lock(p1: String, p2: String, method: () -> Boolean): String 
       return if (method()) "false" else "true"
   

   /**
    * 另外一个类
    */
   class Test
       fun test():Boolean
           print("测试::")
           return  false
       
   

fun lock(p1: String, p2: String, method: (str1: String, str2: String) -> String): String
return method(p1, p2)

fun lock(p1: String, p2: String, method: () -> Boolean): String
return if (method()) “false” else “true”

这两个方法分别需要一个lamda表达式,一个是两参数String,并且返回String的,一个是无参函数,返回boolean类型的。
这样,这两个函数就可以以::形式传参 并传入我们的getResult 和 test函数。

这里有一点需要注意的就是,如果在同一个类里的方法,可以直接::method,但是如果在另一个类里面,就需要另一个类的实例::method 了。

a::method 和 a.method 一样吗

首先,肯定不一样的,但是在学习过程中我以为是一样的,所以走了弯路,比如代码这么写的时候

if (testInstance::test)
            print(true)
        

我以为会和普通方法调用一样

if (testInstance.test())
            print(true)
        

但其实根本不一样 啊,所以看一下定义
Kotlin 中 双冒号操作符 表示把一个方法当做一个参数 ,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法
这种写法只是一个参数。需要传递到另一个方法中使用,所以千万不要混淆~~

特此记录。

以上是关于Kotlin学习之双冒号的主要内容,如果未能解决你的问题,请参考以下文章

1.shell学习之常用语句

Kotlin :: 双冒号 函数引用

Kotlin:: 双冒号操作符详解 ( 获取类的引用 | 获取对象类型的引用 | 获取函数的引用 | 获取属性的引用 | Java 中的 Class 与 Kotlin 中的 KClass )

Kotlin学习之反射

Kotlin学习之变量和函数的讲解

Kotlin学习之委托机制