#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
}
}