【问题标题】:How to set a property of a created object in kotlin?如何在 kotlin 中设置已创建对象的属性?
【发布时间】:2021-01-23 06:39:27
【问题描述】:

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

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

}

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

【问题讨论】:

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

标签: oop kotlin properties


【解决方案1】:

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

如果您阅读documentation of Kotlin classes,您会偶然发现以下段落(链接文档中的第一个):

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

这仅仅意味着它在 Kotlin 中是不可能的,它指出你甚至不应该大量使用运行时检查,这是可能的。

【讨论】:

    【解决方案2】:

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

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

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

    val myMap = HashMap<String, Int>()
    myMap["newattribute"] = 2
    
    println(myMap["newAttribute"]) // prints "2"
    

    请注意,键和值的类型是明确定义的。给定的Map 只能处理相同类型的键(此处为Strings)和相同类型的值(此处为Ints)。这意味着您不能使用上面示例中定义的地图执行myMap["stringProperty"] = "text"

    如果您真的想要更通用的内容(尤其是值),则需要使用更广泛的类型作为地图中的“值”类型。例如,改用MutableMap&lt;String, Any&gt;,这样值就可以是任何非空类型:

    val myMap = HashMap<String, Any>()
    myMap["intAttr"] = 42
    myMap["strAttr"] = "text"
    
    println(myMap["intAttr"]) // prints "42"
    println(myMap["strAttr"]) // prints "text"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2020-07-02
      相关资源
      最近更新 更多