Kotlin泛型集合作为函数参数



在我的Android应用程序中,我有一个名为FilterOption的父类,它有两个名为UserFilterOptionBusinessFilterOption的子类。

abstract class FilterOption<T> {
abstract fun match(filter: T): Boolean
}
如预期的那样,子类实现这个类并传递它们的T类型。

我在我的自定义View类中有另一个函数,它接受这些过滤器的Set<>,并对它们起作用:

interface FilterableView<T> {
fun onFilterOptionChanged(filterOption: FilterOption<T>)
private fun addFilter(menu: Menu, labelResId: Int, filterOptions: Set<FilterOption<T>>, filterOption: FilterOption<T>) {
menu.add(labelResId).apply {
isCheckable = true
isChecked = filterOptions.contains(filterOption)
setOnMenuItemClickListener {
onFilterOptionChanged(filterOption)
true
}
}
}
}

我这样定义我的视图:

class BusinessFragment : FilterableView<BusinessFilterType> {
....
}

但是当我尝试在FilterableView类中调用此函数时,我得到错误:

private fun addBusinessFilters(menu: Menu, businessFilterOptions: Set<FilterOption<T>>) {
addFilter(
menu, R.string.general_open, businessFilterOptions,
BusinessFilterOption.BusinessType.Open  <-- ERROR HERE
)
addFilter(
menu, R.string.general_closed, businessFilterOptions,
BusinessFilterOption.BusinessType.Closed  <-- ERROR HERE
)
}

错误:

Type mismatch.
Required: FilterOption<T>
Found: BusinessFilterOption.BusinessType.Open

对于其他类型("Closed"),以及UserFilter上的所有其他类型,这是相同的。

这是BusinessFilters的定义:
sealed class BusinessFilterOption : FilterOption<Business.View.BusinessModel>() {
sealed class BusinessFiltersType(private val type: BusinessFilterType) : BusinessFilterOption() {
override fun match(filter: Business.View.BusinessModel): Boolean {
//check if match with open or closed
}
object Open : BusinessFiltersType(BusinessFilterType.OPEN)
object Closed : BusinessFiltersType(BusinessFilterType.CLOSED)
}
}

所以我要做的是使addfilter方法通用,所以我可以传递UserFilterOptionBusinessFilterOption给它,因为它们都继承自FilterOption<T>,所以我不明白为什么错误告诉我我需要传递父类,当我传递子类时。

有人能帮忙吗?由于

我认为你唯一的问题是你的BusinessFragment的声明。你的FilterableView接口接受一个T,它与你的FilterOption中的T类型相同。

你的BusinessFilterType类是FilterOption<Business.View.BusinessModel>,所以你的BusinessFragment应该被声明为BusinessFragment<Business.View.BusinessModel>而不是BusinessFragment<BusinessFilterType>

addFilter中的TFilterableView<T>中定义。这意味着传递给FilterableView的类型决定了可以传递给addFilter的有效参数。对于BusinessFragment,只允许使用BusinessFilterOption

addBusinessFilters在哪里定义?考虑到您先前定义的通用FilterableView<T>,此方法似乎违反直觉。

所以我要做的是使addfilter方法通用所以我可以传递UserFilterOption和BusinessFilterOption给它

不要混淆泛型和继承,尽管您可能有兴趣阅读更多关于泛型约束的内容。

如果这是你想要的,你需要多态性,你的视图应该被允许使用任何FilterOptions<T>。冒着不理解您的设计考虑的风险,您可能希望使FilterableView<T>泛型,而使addFilter成为泛型方法。

private fun <T> addFilter(
...,
filterOptions: Set<FilterOption<T>>,
filterOption: FilterOption<T>
) { ... }

最新更新