2013-05-10 2 views
3

Я пытаюсь реализовать универсальный адаптер для Android в Scala. Это мои классы:Ошибка параметра типа Scala, а не член параметра типа

class ScalaAdapter[A <: AnyRef](context: Context, resource: Int, objectsList: ArrayBuffer[A], adapterCb: AfAdapterItemCb) extends BaseAdapter with Filterable {...} 

И черта, которая каждый пользователь адаптер должен реализовать это:

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 

Я не мог понять манифеста, чтобы исправить это. Кто-нибудь понимает, в чем проблема?

ответ

4

Как отметил Travis Brown, это называется затенения, и может быть extremelyannoying.

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 
} 
+1

Стоит отметить, что это называется _shadowing_, и может быть [очень] (HTTP: // StackOverflow. com/a/14023882/334519) [раздражает] (http://stackoverflow.com/a/13830404/334519). –

+0

@TravisBrown: Я забыл искать существующие ответы, моя вина. – senia

+0

Большое спасибо. Он работает сейчас. То есть, когда мы используем общие типы (T), мы должны использовать match-case? Мы не можем использовать указанный тип вместо T? – Srinivas

Смежные вопросы