Scala: "class needs to be abstract, since method is not defined" error

scala

Solution

`def something(num:Int):Boolean` and `def something[S](num:S):Boolean` have different method signatures. The argument type of the first is `Int`. The argument type of the second is the generic `S`.

class Foo extends A {
  // You have to implement this abstract method
  // that is inherited from B via A.
  def something[S](num:S):Boolean = ???
}

trait A extends B {
  def something(num:Int):Boolean = {
    num == 1
  }
}

trait B {
  def something[S](num:S):Boolean
}

Imagine trying to call the `something[S](num:S)` method inherited from `B`:

new Foo().something[String]("x")

If you could get away with not implementing it, what would you expect to happen?

In the second example, since `A` inherits `B[Int]`, the class generic `S` is bound to `Int`, so the method that `A` inherits is `something(num:Int)`, which does have the same signature as the implemented method.

Problem

I'm familiar with this error message but I'm not quite sure about it in this case: ``` class Foo extends A { // getting error here } trait A extends B { def something(num:Int):Boolean = { num == 1 } } trait B { def something[S](num:S):Boolean } ``` But this compiles fine: ``` class Foo extends A ... trait A extends B[Int] { def something(num:Int):Boolean = { num == 1 } } trait B[S] { def something(num:S):Boolean } ``` Full error: `class Foo needs to be abstract, since method something in trait A of type [S](num: S)Boolean is not defined` Shouldn't the first compile? What am I doing wrong here and how can I fix it?

Original source