what does "::" mean in kotlin? what does "::" mean in kotlin? android android

what does "::" mean in kotlin?


:: converts a Kotlin function into a lambda.

Let's say you have a function that looks like this:

fun printSquare(a: Int) = println(a * 2)

And you have a class that takes a lambda as a 2nd argument:

class MyClass(var someOtherVar: Any, var printSquare: (Int) -> Unit) {            fun doTheSquare(i: Int) {        printSquare(i)    }}

How do you pass the printSquare function into MyClass? If you try the following, it wont work:

  MyClass("someObject", printSquare) //printSquare is not a LAMBDA, it's a function so it gives compile error of wrong argument

So how do we CONVERT printSquare into a lambda so we can pass it around? Use the :: notation.

MyClass("someObject",::printSquare) //now compiler does not complain since it's expecting a lambda and we have indeed converted the `printSquare` FUNCTION into a LAMBDA. 

Also, please note that this is implied... meaning this::printSquare is the same as ::printSquare. So if the printSquare function was in another class, like a presenter, then you could convert it to lambda like this:

presenter::printSquare

UPDATE:

Also this works with constructors. If you want to create the constructor of an object and then convert it to a lambda, it is done like this:

(x, y) -> MyObject::new

this translates to MyObject(x, y) in Kotlin.


:: is used for Reflection in kotlin

  1. Class Reference val myClass = MyClass::class
  2. Function Reference this::isEmpty
  3. Property Reference ::someVal.isInitialized
  4. Constructor Reference ::MyClass

For detailed reading Official Documentation


As stated in the docs this is a class reference:

Class References: The most basic reflection feature is getting the runtime reference to a Kotlin class. To obtain the reference to a statically known Kotlin class, you can use the class literal syntax:

val c = MyClass::class//The reference is a value of type KClass.

Note that a Kotlin class reference is not the same as a Java class reference. To obtain a Java class reference, use the .java property on a KClass instance.

It’s also the syntax for method references as in this simple example:

list.forEach(::println)

It refers to println defined in Kotlin Standard library.