我不知道如何在Kotlin中处理泛型。
我正在编写一个用于对通用对象进行更改的历史记录类,该类应该获取任何类型的类作为参数:之后,我将比较旧对象值与新对象值,如果发现差异,我将其写在我的数据类中。
我已经成功地使用Java bean.getClass().getMethods();
来做到这一点,但是我想尝试迁移到Kotlin。
class ChangeHistoryUtils<T> (val originalBean : T, username : String , var modifiedBean: T? = null) {
data class ChangeHistory(val username: String, val fieldName : String,
val oldValue : String , val newValue : String , val date : LocalDate = LocalDate.now())
fun compareBeans(){
//how to get all originalBean getters and its values?
}
}
我实际上被困在这里:应该如何在我的T
对象中获取所有吸气剂?
让我们猜测我将收到一个包含10个getter的类,我想在originalBean
中调用所有这10个getter,并将其值与modifiedBean
中的值进行比较。如果不同,我将其写在ChangeHistory
谢谢
答案 0 :(得分:4)
您需要确保T
本身不是可为null的类型,即在类声明中使用类似where T : Any
之类的内容,例如:
class ChangeHistoryUtils<T> (originalBean : T, username : String , modifiedBean: T? = null) where T : Any
如果这样做,您以后可以像在Java中那样访问方法。如果您只想重用已有的代码,
fun compareBeans(){
originalBean::class.java.methods // this is actually your originalBean.getClass().getMethods() !
// just print the methods for now...
.forEach(::println)
}
但是当您使用Kotlin时,您可能宁愿使用Kotlin方法,例如仅显示属性或类似内容:
originalBean::class.memberProperties
// again just printing them:
.forEach(::println)
然后,您需要添加kotlin-reflect
作为依赖项。您可能还需要检查Kotlin reference regarding reflection。