如何在Kotlin中将类类型传递给函数?

时间:2019-12-03 09:54:30

标签: kotlin

我有一个函数来确定列表是否包含指定的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

1 个答案:

答案 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>()