A的Kotlin变量到B的变量

时间:2019-01-06 13:14:00

标签: generics kotlin

我正在尝试实现一个可以由其他Filter类组成的Filter类,目标是每个过滤器都可以处理一个对象并返回一个布尔值,如果它是由多个过滤器组成的,它将计算其所有对象的AND过滤器。

我正在尝试让构造函数之一采用谓词 vararg ,这些谓词需要转换为Filters的 vararg 。编译器说,这些参数都不能调用任何函数(主要构造函数和第一构造函数)。

我的理解是*应该将List<Filter<T>>转换为vararg Filter<T>,但不能正常工作。

class Filter<in T>(private vararg val filters: Filter<T>) {
    constructor(predicate: (T) -> Boolean) : this(Filter(predicate))
    constructor(vararg predicates: (T) -> Boolean) : this(Filter<T>(*(predicates.map { predicate -> Filter<T>(predicate) })))

    fun process(input: T): Boolean {
        for (filter in filters) { if (!filter.process(input)) return false }
        return true
    }
}

我该怎么做?

此外,与仅检查谓词相比,遍历仅一个谓词的过滤器是否会产生较大的开销(考虑到要过滤列表,这将被称为很多次)?

1 个答案:

答案 0 :(得分:1)

没有'*'是扩展运算符,可以在数组上使用以作为vararg参数传递。您需要将最后一个构造函数更改为:

constructor(vararg predicates: (T) -> Boolean) : this(*predicates.map { Filter(it) }.toTypedArray())

谓词映射到Filter列表,然后将该列表转换为数组,并使用传播运算符作为vararg传递。

请注意,您不需要指定任何类型,因为编译器可以推断出这些类型。