我是Kotlin的新手 我使用此代码打开另一个活动:
startActivity(Intent(this,IntroAndLang::class.java))
目前的活动和目标活动都写在Kotlin
中我无法理解为什么在:
没有单::
而不是IntroAndLang::class.java
答案 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)
用于科特林的倒影
::
val myClass = MyClass::class
list::isEmpty()
::someVal.isInitialized
答案 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')