Kotlin:构造函数中的varargs的vararg

时间:2019-01-20 22:41:14

标签: generics kotlin

我正在尝试实现Filter类。我的第一个版本是关于这个问题的版本:Kotlin vararg of A to vararg of B

到那时,我还没有注意到使用谓词进行构造时的递归性,因此我正在寻找另一种实现方式。

我已将其更改为此类声明:class Filter<in T>(vararg val predicates: (T) -> Boolean)

我正在尝试让其他构造函数起作用:

constructor(vararg filters: Filter<T>) : this(/* do something */)

我不知道如何将过滤器的变量(包含谓词的变量)映射到在每个过滤器中具有所有谓词的谓词的变量,尤其是考虑到我无法调用过滤器类中的任何函数,因为当时尚未初始化。

还有,是否有更好的方法来实现我想要的目标(可以使用谓词数组或类本身的实例数组创建的类)?

1 个答案:

答案 0 :(得分:1)

也许是这样的:

typealias Predicate<T> = (T) -> Boolean

class Filter<T> {
    private val pred: MutableList<Predicate<T>> = mutableListOf()

    constructor(vararg val predicates: Predicate<T>) {
        predicates.forEach { pred.add(it) }
    }

    constructor(vararg filters: Filter<T>) {
        filters.forEach { pred.addAll(it.pred) }
    }
}

fun main(args: Array<String>) {
    val f1 = Filter<String>({true}, {true})
    val f2 = Filter<String>(f1, f1)
}