Oop 如何在kotlin中设置已创建对象的属性?

Oop 如何在kotlin中设置已创建对象的属性?,oop,kotlin,properties,Oop,Kotlin,Properties,我在这个站点上看到了许多不同的类似问题,它们都引用了这个问题,但都是为了从类本身内部创建属性。我已经查阅了kotlin文档一段时间了,似乎找不到解决方案。我正在尝试接收一个随机对象并为其添加属性 //create this object class random(val name : String?){ } var obj = random("bob") obj.newattribute :Int = 2 //cant do this in this lang 看起来您

我在这个站点上看到了许多不同的类似问题,它们都引用了这个问题,但都是为了从类本身内部创建属性。我已经查阅了kotlin文档一段时间了,似乎找不到解决方案。我正在尝试接收一个随机对象并为其添加属性

//create this object
class random(val name : String?){

}

var obj = random("bob")
obj.newattribute :Int = 2 //cant do this in this lang

看起来您的意图是在运行时通过向类的实例添加新属性来操作该类

如果您阅读了,您将偶然发现以下段落(链接文档中的第一段):

Kotlin的对象模型与Python有很大的不同。最重要的是,类在运行时不可动态修改!(这方面有一些有限的例外,但通常不应该这样做。但是,可以在运行时使用名为反射的功能动态检查类和对象-这可能很有用,但应该明智地使用。)所有属性(属性)类上可能需要的函数必须直接在类主体中声明,或者作为扩展函数声明,因此您应该仔细考虑类设计

这仅仅意味着在Kotlin中是不可能的,并且它声明您甚至不应该大量使用运行时检查,这是可能的。

在Kotlin中,您不能(而且无论如何也不应该)在运行时更改实例的“形状”,因为类型系统在这里是为了保护用户并为您正在操作的值提供保证

也就是说,如果您需要的是一个键值存储,您可以在其中放置键值对并通过键值访问值,那么您应该使用
MutableMap
接口的实现

例如,
HashMap
是该接口的一个实现:

val myMap=HashMap()
myMap[“newattribute”]=2
println(myMap[“newAttribute”])//打印“2”
请注意,键和值的类型定义良好。给定的
Map
只能处理相同类型的键(此处
String
s)和相同类型的值(此处
Int
s)。这意味着您无法使用上面示例中定义的映射执行
myMap[“stringProperty”]=“text”

如果您真的想要更一般的东西(特别是对于值),您需要在映射中使用更广泛的类型作为“值”类型。例如,改用
MutableMap
,使值可以是任何非空类型:

val myMap=HashMap()
myMap[“intAttr”]=42
myMap[“strAttr”]=“文本”
println(myMap[“intAttr”])//打印“42”
println(myMap[“strAttr”])//打印“文本”

我很想知道您的用例是什么。你想实现什么?幸运的是你做不到。Kotlin是一种强类型语言。@Joffrey我正在为社交网络系统创建firebase库框架。使用可以传入数据类的数据库,firebase将获取数据类的所有属性,并在指定的数据库引用位置内创建键值对。因此,我的库将获取数据类对象并向其添加属性,然后将其提交到指定的firebase数据库引用。但是我想我可以手动地从传入的数据类对象中提取属性,然后用我的新属性创建我自己的对象。