【问题标题】:Issue with trait and case class inheritance: scala特征和案例类继承问题:scala
【发布时间】:2021-08-11 05:48:43
【问题描述】:

下面的代码给了我错误 方法 '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
  }
}


【问题讨论】:

  • 我收到以下错误消息:(Note that A does not match C: class C is a subclass of trait A, but method parameter types must match exactly.)

标签: scala inheritance


【解决方案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】:

    Tim 的答案的替代方案,也许你想要这样的东西:

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

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多