Generics Kotlin:在函数的filterIsInstance中使用的传递类类型

Generics Kotlin:在函数的filterIsInstance中使用的传递类类型,generics,kotlin,Generics,Kotlin,我已经用kotlin编写了一个函数 private fun mapBasketToTeam(basketIter: GenericBasket) { val fruitBasket = basketIter.basketTypeMap.getOrDefault(BasketType.FRUIT, listOf()) .filterIsInstance<FruitBasket>() val groceryBasket =

我已经用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或FruitBasket,并分别返回List或List。这样两行中就不会有相同代码的重复

有没有办法将类类型传递给函数,然后将其传递给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>() 
}
然后像这样使用它:

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

如果出于某种原因需要保留枚举,我不知道如何在不进行不安全强制转换的情况下执行此操作。

这些是否已按类型排序?我看到你正在按篮子类型列出一份清单。例如,与BasketType.FRUIT关联的列表是否已经包含专门的水果篮项目?是。映射将枚举与列表相关联。对于enum FRUIT,与键FRUIT对应的映射中的值将是一个列表,所有条目的类型都是FruitBasket。因此,如果有其他方法将父类列表转换为子类列表,则可以直接使用它,而不是使用filterByInstance。只能通过不安全的强制转换。但是,如果您控制添加和检索项目的功能,您可以自己确保安全。不过,我认为BasketType枚举增加了复杂性。我添加了一个关于如何在没有枚举的情况下执行此操作的答案。