在我的Android应用程序中,我有一个名为FilterOption
的父类,它有两个名为UserFilterOption
和BusinessFilterOption
的子类。
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
上的所有其他类型,这是相同的。
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
方法通用,所以我可以传递UserFilterOption
和BusinessFilterOption
给它,因为它们都继承自FilterOption<T>
,所以我不明白为什么错误告诉我我需要传递父类,当我传递子类时。
有人能帮忙吗?由于
我认为你唯一的问题是你的BusinessFragment
的声明。你的FilterableView
接口接受一个T
,它与你的FilterOption
中的T
类型相同。
你的BusinessFilterType
类是FilterOption<Business.View.BusinessModel>
,所以你的BusinessFragment
应该被声明为BusinessFragment<Business.View.BusinessModel>
而不是BusinessFragment<BusinessFilterType>
。
addFilter
中的T
在FilterableView<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>
) { ... }