【问题标题】:Kotlin: mutableMap doesn't recognise put()Kotlin:mutableMap 无法识别 put()
【发布时间】:2021-03-21 15:34:56
【问题描述】:

这是食谱应用程序的一部分。我在我写的食谱课上。成分是我写的另一门课。想法是将成分及其数量(作为 Int)存储在地图中。

在类主体中,我已将地图声明为:

var ingredients: Map<Ingredient, Int>

在 init{} 正文中:

ingredients = mutableMapOf<Ingredient, Int>()

问题来了——这个功能是添加一种成分。如果成分已经在地图中,它会更新数量。 put() 方法应该这样做,但 Android Studio 将其变为红色,当我将鼠标悬停在“put”一词上时,它显示“未解析的引用:put”。加号也有红色下划线。我认为这是可变映射的基本部分。我哪里出错了? (别担心 - 会有一个“其他”部分!)

fun addIngredientAndAmount(ingredient: Ingredient, quantity: Int) {
    if (ingredients.containsKey(ingredient)) {
        val oldQuantity = ingredients[ingredient]
        ingredients.put(ingredient, oldQuantity + quantity)
    }
}

【问题讨论】:

  • 您将该属性标记为Map,而不是MutableMap。即使底层对象碰巧是可变的,编译器也只能看到属性类型。但是为什么要在单独的init 块中初始化属性呢?
  • 我们正在初始化 init 块中的一些其他内容,因此它看起来更整洁一些。另外,这是我们第一次在项目中使用 Kotlin,我们对 Java 更习惯了一点。就上下文而言,这是作为大师的一部分的小组项目。

标签: dictionary kotlin mutable


【解决方案1】:

您的ingredients 被声明为Map,但Map 表示只读接口,因此它没有put,它是MutableMap 的函数。初始化为MutableMap没关系,因为编译器会检查你为变量指定的类型。

您应该将其声明为:

var ingredients: MutableMap<Ingredient, Int>

您也可以就地初始化它,而不是使用 init 块:

var ingredients: MutableMap<Ingredient, Int> = mutableMapOf<Ingredient, Int>()

如果你这样做,你也可以避免显式声明类型,因为编译器会自动推断它。

var ingredients = mutableMapOf<Ingredient, Int>()

var ingredients: MutableMap<Ingredient, Int> = mutableMapOf()

【讨论】:

  • 谢谢,这成功了!我之前试过它变成了红色,所以我想我拼错了。愚蠢的。但是,加号仍然用红色下划线 - 我只想将两个整数加在一起。在 put() 方法中使用它之前,真的有必要把它放在一个变量中吗?
  • 没关系,我通过添加修复它!后配料[成分]
  • 我还建议将其设为val。对可变集合使用读写属性有点容易出错,因为它可以通过两种不同的方式进行更改。在某些情况下,您可能需要这种灵活性,但应该很少见。
  • @Donagh !! 是一种代码味道——表明可能存在an underlying problem,并且通常有更好的方法。在这种情况下,您可以从地图中获取现有值,如果它不为空,则更新它。一种简洁的方式可能是:ingredients[ingredient]?.let{ ingredients[ingredient] = it + quantity }...
  • ……尽管从方法名称来看,我怀疑您的 else 部分也会为新成分设定值。您可以在一行中同时完成这两项操作:ingredients[ingredient] = (ingredients[ingredient] ?: 0) + quantity.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多