首页 > 解决方案 > 我如何处理 Kotlin 中返回的对象表达式

问题描述

fun personInfo(_name: String, _age: Int):Any {

    val person = object {
        val name = _name
        val age = _age
    }
    return person
}
fun main() {

   val result = personInfo("sam", 36)
    println(result.name) //error
    println(result.age) //error

}

为什么我不能使用“println(result.name)”和“println(result.age)”???

标签: genericskotlin

解决方案


为什么我不能使用“ println(result.name)”和“ println(result.age)”???

因为您将返回类型声明fun personInfoAny。表达式object没有命名类型,因此除非您直接引用表达式的结果,否则您无法引用它,只有当它是顶级变量时才能这样做。

Kotlin 没有结构类型,相反,您必须声明具有这些属性的命名接口:

interface PersonInfo {
    val name: String
    val age: Int
}

fun personInfo(_name: String, _age: Int) = object : PersonInfo {
    override val name = _name
    override val age = _age
}

但是,我认为这在 Kotlin 中是一个非常尴尬的习惯用法,数据类会更自然:

data class PersonInfo(
    val name: String,
    val age: Int
)

fun personInfo(_name: String, _age: Int) = PersonInfo(_name, _age)

您也可以直接删除fun personInfo并使用构造函数。


推荐阅读