generics - 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>()
}
现在我想通过创建一个新函数来简化它,该函数将类的类型作为GroceryBasket
orFruitBasket
并分别返回我List<GroceryBasket>
or List<FruitBasket>
。这样就不会在两行中重复相同的代码。
有没有办法将类类型传递给可以传递给的函数filterIsInstance
?
解决方案
如果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>()
}
如果出于某种原因您需要保留枚举,我看不出如果没有不安全的强制转换,您将如何做到这一点。
推荐阅读
- java - Kafka 2 消费者工厂监听器没有不断连接
- oh-my-zsh - 获取 oh-my-zsh 'history' 以显示命令日期和时间
- maven - 如何部署到 Nexus Sonatype 新的 Maven 模块
- c# - 如何使用 Json.Net 为数组项应用 CustomCreationConverter
- mysql - Mysql将现有列添加到另一个表
- php - Symfony 使用 GET 类型将参数传递给方法
- c++ - 为什么 cv::format 没有给我预期的结果?
- php - PHP 中需要 SQLPLUS 脚本来运行 Oracle 查询
- linux-kernel - 当它与进程结束或睡眠重叠时,如何通常阻止定时器中断
- c++ - Google Mock std::shared_prt 调用问题