generics - 我如何处理 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)”???
解决方案
为什么我不能使用“
println(result.name)
”和“println(result.age)
”???
因为您将返回类型声明fun personInfo
为Any
。表达式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
并使用构造函数。
推荐阅读
- macos - 在 macOS 上使用 Core Image 获取 RAW 图像大小的正确方法是什么
- leaflet - 在 Leaflet 的 DashArray 中使用简单标记
- python - 如何在 for 循环中向 HTML 变量添加(超)链接?(烧瓶)
- c++ - 需要帮助理解这一行 char (*p(int,int))[10]
- r - 使用 tidyverse 识别链接的文档(文档树/沿袭)
- javascript - 如何检查深层对象属性
- f# - 函数中实现的接口成员的访问值
- python - 如何在现有的 Django 项目中实现组权限?
- javascript - 如何从 js [SYMFONY] 中的树枝表中获取信息
- python - 如何在 Selenium 中使用插件?