首页 > 解决方案 > Kotlin:在函数中传递用于 filterIsInstance 的类类型

问题描述

我在 kotlin 中写了一个函数

private fun mapBasketToTeam(basketIter: GenericBasket) {
        val fruitBasket = basketIter.basketTypeMap.getOrDefault(BasketType.FRUIT, listOf())
                .filterIsInstance<FruitBasket>()
        val groceryBasket = basketIter.basketTypeMap.getOrDefault(BasketType.GROCERY, listOf())
                .filterIsInstance<GroceryBasket>()
}

现在我想通过创建一个新函数来简化它,该函数将类的类型作为GroceryBasketorFruitBasket并分别返回我List<GroceryBasket>or List<FruitBasket>。这样就不会在两行中重复相同的代码。

有没有办法将类类型传递给可以传递给的函数filterIsInstance

标签: genericskotlin

解决方案


如果BasketType除了对这些项目进行排序之外,您没有将枚举用于任何其他操作,则可以消除枚举并将 GenericBasket 中地图的键类型更改为 KClass。然后你可以像这样向你的 GenericBasket 添加一个函数:

inline fun <reified T: Any> getBasketsOfType(): List<T> = 
    basketTypeMap[T::class].orEmpty().filterIsInstance<T>()

然后像这样使用它:

private fun mapBasketToTeam(basketIter: GenericBasket) {
        val fruitBasket = basketIter.getBasketsOfType<FruitBasket>()
        val groceryBasket = basketIter.getBasketsOfType<GroceryBasket>() 
}

如果出于某种原因您需要保留枚举,我看不出如果没有不安全的强制转换,您将如何做到这一点。


推荐阅读