我正在尝试在Scala中实现适用于Android的通用适配器。这些是我的课程:
class ScalaAdapter[A <: AnyRef](context: Context, resource: Int, objectsList: ArrayBuffer[A], adapterCb: AfAdapterItemCb) extends BaseAdapter with Filterable {...}
Adapter的每个用户必须实现的特性是:
trait AfAdapterItemCb {
def itemCb[A](item: A, view: View) {}
}
我的模特课是:
case class ScheduleItem(name: String, priority: Int)
当我实现回调特征时,我收到与类型参数相关的错误:
private class AdapterCbImpl extends AfAdapterItemCb {
override def itemCb[ScheduleItem](schedule: ScheduleItem, view: View) = {
view.findViewById(R.id.tv_name).asInstanceOf[TextView].setText(schedule.name)
view.findViewById(R.id.tv_priority).asInstanceOf[TextView].setText(schedule.priority.toString)
}
}
当我尝试使用计划对象来填充视图时,我收到错误:
value name is not a member of type parameter ScheduleItem
value priority is not a member of type parameter ScheduleItem
我无法理解Manifest来修复它。有人知道问题是什么吗?
答案 0 :(得分:4)
如Travis Brown所述,这称为 shadowing ,可以是extremely annoying。
override def itemCb[ScheduleItem](schedule: ScheduleItem, view: View) = {
ScheduleItem
这是一个类型参数名称,就像T
一样。它与case class ScheduleItem
无关。
您不能使用具体类型使用类型参数覆盖方法。
我不知道如何使用AfAdapterItemCb
,但您可以尝试这样的事情:
override def itemCb[T](item: T, view: View) = item match {
case schedule: ScheduleItem => ... //your code
case _ => ... // item is not a ScheduleItem
}