在Kotlin中使用伴随对象的通用扩展类

时间:2017-10-30 14:54:46

标签: generics kotlin

我编写了以下代码,但它不起作用,因为我收到未解析的引用错误。

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 类调用默认构造函数?

我尝试了不同的方法,但它仍然不起作用。这次我得到一个不能使用&#39; T&#39;作为具体的类型参数。使用类错误。

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

2 个答案:

答案 0 :(得分:1)

Array类型的行为与 Java 中的数组相同。因此它很特殊,并且不适用于泛型。相反,您应该使用 Java List方法。这意味着在 Kotlin 中使用MutableList

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

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

答案 1 :(得分:0)

您可以尝试将Population课程视为以下代码:

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

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

我希望它可以帮到你。