Проблема с наследованием классов признаков и случаев: scala

#scala #inheritance

Вопрос:

Приведенный ниже код выдает мне ошибку, метод «someMethod» ничего не переопределяет

Но разве класс C не расширяет признак A? Почему я получаю эту ошибку

 trait A

trait B {
   def someMethod(req: A): Unit
}

case class C(i: Int, j: Int) extends A

object D extends B {
  override def someMethod(req: C) ={
     //some implementation
  }
}


 

Комментарии:

1. Я получаю следующее сообщение об ошибке: (Note that A does not match C: class C is a subclass of trait A, but method parameter types must match exactly.)

Ответ №1:

Проблема в том, что вы можете передать этому методу любое значение типа A :

 def someMethod(req: A)
 

Но вы можете передавать этому методу только значения типа C :

 override def someMethod(req: C)
 

Таким образом, вторая версия не является полной реализацией первой, потому что она не может обрабатывать значения типа A , которые не являются значениями типа C . Так что вторая версия не может override быть первой.

Возможное решение:

 override def someMethod(req: A) =
  req match {
    case C(i, j) => // Code
    case _ => // Error handling
  }
 

Ответ №2:

Альтернатива ответу Тима, может быть, вы хотите что-то вроде этого:

 trait A
final case class C(i: Int, j: Int) extends A

trait B[T <: A] {
  def someMethod(req: T): Unit
}

object D extends B[C] {
  override def someMethod(req: C): Unit = {
     //some implementation
  }
}