繁体   English   中英

Kotlin:通过 function 中 filterIsInstance 中使用的 class 类型

[英]Kotlin: pass class type used in filterIsInstance in a function

我在 kotlin 中写了一个 function

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>()
}

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

有没有办法将 class 类型传递给 function 然后可以传递给filterIsInstance

如果除了对这些项目进行排序之外,您没有将BasketType枚举用于任何其他操作,则可以消除枚举并将 GenericBasket 中 map 的密钥类型更改为 KClass。 然后您可以像这样将 function 添加到您的 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>() 
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM