我有一个函数来确定列表是否包含指定的gpuimage过滤器类型,想要传递参数:GPUImageSaturationFilter
来起作用,函数使用它来完成:
public var filters: GPUImageFilterGroup
//filterClass:the specified gpuimage filter type extend GPUImageFilter
public fun getFilter(filterClass:the specified gpuimage filter type):GPUImageFilter {
//filters.filters is a List<GPUImageFilter>
filters.filters.forEach {
if (it is filterClass) {
return it
}
}
}
如何替换以下有趣的参数?我不想使用HashMap,谢谢!
filterClass:the specified gpuimage filter type
答案 0 :(得分:4)
如果您希望在运行时确定filterClass
:
public fun getFilter(filterClass: KClass<out GPUImageFilter>): GPUImageFilter? {
//filters.filters is a List<GPUImageFilter>
return filters.filters.first { filterClass.isInstance(it) }
}
(请注意,它必须可以为空,因为filters.filters
可能不包含任何此类内容)。可以具有更精确的返回类型
public fun <T : GPUImageFilter> getFilter(filterClass: KClass<T>): T? {
//filters.filters is a List<GPUImageFilter>
filters.filters.first { filterClass.isInstance(it) } as T?
}
致电:
getFilter(GPUImageSaturationFilter::class)
请参见KClass
。您还可以使用java.lang.Class
和
getFilter(GPUImageSaturationFilter::class.java)
您也可以这样做(假设您已经使用KClass
定义了其中一个版本,否则可以将其定义与it is T
一起使用来代替filterClass.isInstance(it)
):
public inline fun <reified T : GPUImageFilter> getFilter() = getFilter(T::class)
getFilter<GPUImageSaturationFilter>()