匿名对象的kotlin访问属性
如何访问匿名对象的对象的属性匿名对象的kotlin访问属性,kotlin,Kotlin,如何访问匿名对象的对象的属性word fun main(args: Array<String>) { val sentence = "this is a nice sentence" val wordLengths: List<Any> = sentence.split(' ').map { object { val length = it.length
word
fun main(args: Array<String>) {
val sentence = "this is a nice sentence"
val wordLengths: List<Any> = sentence.split(' ').map {
object {
val length = it.length
val word = it
}
}
wordLengths.forEach { it:Any -> println(it) }
}
fun main(args:Array){
val句子=“这是一个很好的句子”
val字长:列表=句子.split(“”).map{
反对{
val length=it.length
val word=it
}
}
wordlength.forEach{it:Any->println(it)}
}
您明确声明字长
为列表:
请注意,匿名对象只能在本地和私有声明中用作类型。如果将匿名对象用作公共函数的返回类型或公共属性的类型,则该函数或属性的实际类型将是匿名对象的已声明超类型,如果未声明任何超类型,则将是Any
。添加到匿名对象中的成员将无法访问
这可以按预期工作,但这可能不是一个好方法
直接的问题是,代码将字长的类型指定为列表,任何都是最上面的类型*;每个类型都是它的一个子类型,因此您只能安全地访问每个类型所拥有的内容(例如toString()
方法)
但是,您不需要指定类型;您可以将其留给Kotlin的类型推断。如果您这样做,它将推断您使用object
关键字定义的类型。该类型是匿名的-您不能写下它的名称-但Kotlin知道它,并且可以访问它的字段:
fun main() {
val sentence = "this is a nice sentence"
val wordLengths = sentence.split(' ').map {
object {
val length = it.length
val word = it
}
}
wordLengths.forEach{ println(it.word) }
}
也就是说,它有点笨拙和脆弱。您最好为该类型定义一个类。事实上,总的来说,它比较短:
fun main2() {
val sentence = "this is a nice sentence"
class Word(val length: Int, val word: String)
val wordLengths = sentence.split(' ').map{ Word(it.length, it) }
wordLengths.forEach { println(it.word) }
}
(实际上,您可能希望在其他地方使用新类,并将其移到方法之外。但如果需要,Kotlin允许您定义本地类。)
---
(*实际上,顶层类型是可空的Any:Any?
。但我忽略了可空性,因为它与此无关。)您定义了一个类并使用该类,而不是使用Any?yea。。我想知道为什么他们允许我优雅地创建一个对象
,却不给我一个访问属性的方法..请清楚地描述你的问题。是什么阻止你使用wordlength.forEach{println(it.word)}
?这就是问题所在。它不会编译。。
fun main2() {
val sentence = "this is a nice sentence"
class Word(val length: Int, val word: String)
val wordLengths = sentence.split(' ').map{ Word(it.length, it) }
wordLengths.forEach { println(it.word) }
}