首页 > 解决方案 > 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 */)

我不知道如何将过滤器的可变参数(包含谓词可变参数)映射到具有每个过滤器中所有谓词的谓词可变参数,特别是考虑到我无法调用过滤器类中的任何函数,因为它没有在那个时候被初始化。

另外,有没有更好的方法来实现我想要得到的东西(一个可以用谓词数组或类本身的实例数组创建的类)?

标签: genericskotlin

解决方案


也许是这样的:

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)
}

推荐阅读