kotlin - 我可以以编程方式设置任何类型的属性吗?
问题描述
我正在尝试编写一个函数,该函数在给定属性类型和值的数据类中设置属性。数据类具有多种类型的属性,例如 String、View 和 Int,并且某些属性可以为空。如果我将功能限制为一种类型,我可以完成这项工作,如下所示:
fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, String>, value: String) {
val cellData = this.tableData[index]
key.set(cellData, value)
}
setDataValue(0, CellData::name, "arlomedia")
但我找不到允许多种类型的方法,如下所示:
fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, Any?>, value: Any?) {
val cellData = this.tableData[index]
key.set(cellData, value)
}
setDataValue(0, CellData::name, "arlomedia")
setDataValue(0, CellData::status, null)
setDataValue(0, CellData::active, true)
在这种情况下,第一个函数调用会显示错误,Type mismatch. Required: KMutableProperty1<CellData, Any?>, Found: KMutableProperty1<CellData, String>
. 我没想到,因为它Any?
的具体类型比.String
String
Any?
我也试过:
fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, *>, value: Any?) {
val cellData = this.tableData[index]
key.set(cellData, value)
}
setDataValue(0, CellData::name, "arlomedia")
在这种情况下,函数调用上的错误消失了,但key.set
行上出现错误:Type mismatch. Required: Nothing, Found: Any?
.
我想我可以为每种数据类型创建一个单独的函数并根据需要调用各种函数,但是这个函数的目的是抽象一些更复杂的数据访问,如果我不得不在多个数据中重复这一点,那么它的好处就会有所损失功能。
有没有办法做到这一点?我已经多次阅读Kotlin Reflection 文档,加上这个文档(出于某种原因,我只在“从 Python 迁移”部分找到了该文档)和许多 StackOverflow 答案,但我没有找到任何与所有相关的东西必要的部分在一起。
解决方案
您可以使用泛型来做到这一点
fun <T> setDataValue(index: TableIndex, key: KMutableProperty1<CellData, T>, value: T) {
val cellData = this.tableData[index]
key.set(cellData, value)
}
推荐阅读
- swift - 每当我在swift中初始化或创建某个数据类型时,如何让某个函数运行?
- python - 如何在kivy中将小部件放置在图像上方并相对于图像?
- python - 完美包装器(在 Python 中)
- elasticsearch - 在弹性搜索中添加条件以过滤聚合
- apple-watch - 找不到位于 assets.xcassets 中的资源
- c++ - 我的代码中运行时错误的可能原因是什么?
- c# - 确定变量是否属于惰性类型
- python - 在Coregraphe中检查字符串中的单词
- android - Android AppAuth - 遵循 PendingIntent 对象
- python - Pandas:在文本列中搜索关键字列表并对其进行标记