什么是“::”在kotlin中意味着什么?

时间:2017-11-20 20:58:22

标签: android kotlin

我是Kotlin的新手 我使用此代码打开另一个活动:

startActivity(Intent(this,IntroAndLang::class.java))

目前的活动和目标活动都写在Kotlin

我无法理解为什么在:没有单::而不是IntroAndLang::class.java

4 个答案:

答案 0 :(得分:12)

docs中所述,这是一个类引用

  

课程参考:   最基本的反射功能是将运行时引用添加到Kotlin类。要获取对静态已知Kotlin类的引用,可以使用类文字语法:

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

请注意,Kotlin类引用与Java类引用不同。 要获取Java类引用,请在KClass实例上使用.java属性。

也是方法引用的语法,如下例所示:

list.forEach(::println)

它指的是Kotlin标准库中定义的println

答案 1 :(得分:7)

::将kotlin函数转换为lambda。

让我们说您有一个如下所示的函数:

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

现在让我们说您有一个将lambda作为第二个参数的类:

class MyClass(var someOtherVar:Any,var printSquare:(Int) -> Unit){

        fun doTheSquare(i:Int){
            printSquare(i)
        }
    }

现在如何将printSquare函数传递到MyClass中?如果您尝试以下操作,将无法正常工作:

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

那么我们如何将printSquare转换为lambda以便我们可以传递它呢?使用::符号。

MyClass("someObject",::printSquare) //now compiler does not compaint since its expecting a lambda and we have indeed converted printSquare FUNCTION into a LAMBDA. 

还请注意,这是隐含的……含义this::printSquare is the same as ::printSquare.,因此,如果在诸如演讲者之类的另一个类中使用了printSquare函数,则可以将其转换为lamba:

presenter::printSquare

更新:

这也适用于构造函数。如果要创建对象的构造函数,然后将其转换为lambda,则可以这样完成:

(x,y)->MyObject::new

这在kotlin中转换为MyObject(x,y)

答案 2 :(得分:4)

@api.model def create(self, vals): vals.update({ 'participants_ids':[ (0, 0, { 'first_name_participant': record.first_name, 'last_name_participant': record.last_name, }) for record in self.env['university.student'].search([ ('first_name','=','Luis') ]) ] }) return super(university_course,self).create(vals) 用于科特林的倒影

  1. 类参考::
  2. 功能参考val myClass = MyClass::class
  3. 属性参考list::isEmpty()
  4. 构造函数参考::someVal.isInitialized

要详细阅读Official Ducumentation

答案 3 :(得分:1)

::运算符还可用于获取对命名函数的lambda引用,并将这些lambda与需要lambda的kotlin关键字(如'let','use','forEach','map'等)一起使用作为参数或与您定义的其他高阶函数(这些函数将另一个函数作为参数)

    init{
    val list = listOf(1, 2, 3)
    list.forEach(::printEachNumberInMyList)
    }

    private  fun printEachNumberInMyList (listItem:Int) {
       print(listItem)
   }

请注意,您没有在函数名称(:: printEachNumberInMyList)后面添加括号'()',因为您不是直接调用函数,而是只是将函数的lambda引用作为参数传递给高阶函数(在这种情况下,是kotlin关键字“ forEach”)。

您还应该在forEach关键字之后立即使用paranthesis(),而不要使用花括号{},如果您要在紧随forEach关键字之后定义lambda的情况下使用大括号{},如下所示

  init{
    val list = listOf(1, 2, 3)
    list.forEach {print(it)}
    }

自从Kotlin 1.1开始,除了上述类,函数,属性和构造函数引用之外,'::'还可以用于获取对所有上述内容的绑定引用。

例如,尽管接收器的类型如下,但可以使用':: class'来获取特定对象的确切类...

val widget: Widget = ...
assert(widget is GoodWidget) { "Bad widget: ${widget::class.qualifiedName}" }

widget :: class返回对象'widget'的确切类为'GoodWidget'或'BadWidget',尽管接收方表达式的类型不同(即最初声明的'Widget')

更多信息,https://kotlinlang.org/docs/reference/reflection.html