匿名对象的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) }
}