首页 文章

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

提问于
浏览
0

我写下面的代码,但它不起作用,因为我得到 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. Use a class instead 错误 .

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

2 回答

  • 0

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

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

    另外一定要将 Chromosome 实现为开放或抽象类 . 否则,您不需要使总体通用,并且 Array 方法将再次起作用 .

  • 1

    您可以尝试将 Population 类作为以下代码:

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

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

    我希望它对你有所帮助 .

相关问题