Generics A的Kotlin vararg到B的vararg
我正在尝试实现一个可以由其他筛选器类组成的筛选器类。目标是每个筛选器都可以处理一个对象并返回一个布尔值,如果它由多个筛选器组成,则会计算其所有筛选器的和 我试图让其中一个构造函数接受谓词的vararg,它需要转换为过滤器的vararg。编译器说,主构造函数和第一个辅助构造函数中的任何函数都不能用这些参数调用 我的理解是*应该将列表转换为vararg过滤器,但它不起作用Generics A的Kotlin vararg到B的vararg,generics,kotlin,Generics,Kotlin,我正在尝试实现一个可以由其他筛选器类组成的筛选器类。目标是每个筛选器都可以处理一个对象并返回一个布尔值,如果它由多个筛选器组成,则会计算其所有筛选器的和 我试图让其中一个构造函数接受谓词的vararg,它需要转换为过滤器的vararg。编译器说,主构造函数和第一个辅助构造函数中的任何函数都不能用这些参数调用 我的理解是*应该将列表转换为vararg过滤器,但它不起作用 class Filter<in T>(private vararg val filters: 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
}
}
我能做些什么来实现这一目标
另外,与只检查谓词相比,只遍历一个谓词的过滤器是否会带来很大的开销?考虑到这会被多次调用,过滤列表?No'*'是扩展运算符,可用于作为vararg参数传递的数组。您需要将上一个构造函数更改为:
constructor(vararg predicates: (T) -> Boolean) : this(*predicates.map { Filter(it) }.toTypedArray())
谓词映射到过滤器列表,然后列表转换为数组,并使用扩展运算符作为vararg传递
注意,您不需要指定任何类型,因为编译器可以推断这些类型