【问题标题】:Generic extending class with companion object in KotlinKotlin 中带有伴生对象的通用扩展类
【发布时间】:2017-10-30 14:54:45
【问题描述】:

我编写了以下代码,但它不起作用,因为我收到 unresolved reference 错误。

class Chromosome {
    constructor() {}

    companion object {
        fun newInstance(): Chromosome {
            return Chromosome()
        }
    }
}

class Population<T>(size: Int) where T: Chromosome {
    var population: Array<T> = Array(size, { _ -> T.newInstance() })
}

我想要一个泛型类型 T 来扩展某个类或接口。我需要调用静态工厂方法,因为我无法在 Array 类构造函数中编写 T()。有什么方法可以包装 Array 类调用默认构造函数?

我尝试了另一种方法,但仍然无法正常工作。这次我得到一个 Cannot use 'T' as reified type parameter。改用类错误。

class Population<T>(size: Int, init: () -> T) where T: Chromosome {
    var population: Array<T> = Array(size, { _ -> init() })
}

【问题讨论】:

  • 我认为ClassYClass Y。对吗?
  • 这在 Java 中和在 Kotlin 中一样有问题。您将如何在 Java 中完全实现这一点?
  • @tynn 好问题。我试图用Java实现,但它也不起作用。因此,当您说这在两种语言中都有问题时,您是对的。

标签: generics kotlin


【解决方案1】:

Array 类型的作用与 Java 中的数组相同。因此它很特殊,不能很好地与泛型一起使用。相反,您应该使用 Java List 方法。这意味着在 Kotlin 中使用 MutableList

class Population<T: Chromosome>(size: Int, factory: () -> T) {
    var population = MutableList(size, { factory() })
}

还要确保将Chromosome 实现为开放类或抽象类。否则,您不需要将总体设为通用,Array 方法将再次起作用。

【讨论】:

    【解决方案2】:

    您可以尝试您的Population 课程,如下所示:

     class Population<T : Class<*>>(size: Int) where T: Chromosome {
    ...
    }
    

    使用上面的代码,您的Population 类可以获得类的泛型类型。

    希望对你有帮助。

    【讨论】:

    • 感谢您的建议,但它不起作用。我收到以下错误:T 的上界有空交集只有一个上限可以是类
    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多