【问题标题】:Classifier issue when creating ArrayList创建 ArrayList 时的分类器问题
【发布时间】:2018-12-06 22:16:10
【问题描述】:

我正在尝试创建 for-loop 以在 ArrayList 中生成项目,但我不确定为什么在这种情况下会出现此“伴随对象”错误。 Product in val product = Product 返回错误:

分类器没有伴生对象,因此必须在这里初始化

内部片段

    val items = resources.getStringArray(R.array.product_names)
    val itemDescriptions = resources.getStringArray(R.array.product_descriptions)
    for (n in items.indices) {
        val product = Product
        product.productName(items[n])
        product.productDescription(itemDescriptions[n])
        productList.add(product)
    }

产品类别

class Product {

    var productName: String? = null
    var productDescription: String? = null

    constructor() {}

    constructor(productName: String, productDescription: String) {
        this.productName = productName
        this.productDescription = productDescription
    }
}

【问题讨论】:

    标签: android for-loop android-fragments arraylist kotlin


    【解决方案1】:

    您必须像这样实例化您的 Product 类:

    val product = Product()
    

    注意与此相对应的括号:

    // ...
    constructor() {} // empty secondary constructor of Product
    // ...
    

    注意:

    您没有充分发挥 Kotlin 的潜力。看看以下重构:

    1. Product类:

      class Product(val productName: String, val productDescription: String)
      

    您可以在主构造函数中声明属性。

    1. for循环

      val productList = items.mapIndexed { index, item ->
          Product(item, itemDescriptions[index])
      }
      

    您可以使用mapIndexed 将项目转换为产品列表。

    【讨论】:

      【解决方案2】:

      要创建Product 的新实例,您必须改用相应的构造函数Product()。仅使用Product 会使编译器认为您正在尝试使用它没有的companion object。以下是 Kotlin 的一部分documentation

      要创建一个类的实例,我们调用构造函数,就好像它是一个常规函数:

      val invoice = Invoice()
      
      val customer = Customer("Joe Smith")
      

      请注意,Kotlin 没有 new 关键字。

      【讨论】:

        【解决方案3】:

        在每次迭代的 for 循环中,您必须通过将数组 itemsitemDescriptions 中的相应项传递给构造函数来“创建”一个 Product 对象,然后将此对象添加到列表中:

        val items = resources.getStringArray(R.array.product_names)
        val itemDescriptions = resources.getStringArray(R.array.product_descriptions)
        for (n in items.indices) {
            val product = Product(items[n], itemDescriptions[n])
            productList.add(product)
        }
        

        这个循环也可以写成:

        items.indices.forEach { productList.add(Product(items[it], itemDescriptions[it])) }
        

        【讨论】:

          猜你喜欢
          • 2011-08-22
          • 1970-01-01
          • 2019-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 2011-12-15
          • 2013-05-25
          相关资源
          最近更新 更多