Scala:“类需要是抽象的,因为方法没有定义”错误

时间:2014-05-26 02:03:42

标签: scala

我熟悉此错误消息,但在这种情况下我不太确定:

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
}

但是编译得很好:

    class Foo extends A ...

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

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

完整错误:class Foo needs to be abstract, since method something in trait A of type [S](num: S)Boolean is not defined

不应该是第一次编译吗?我在这里做错了什么,如何解决?

1 个答案:

答案 0 :(得分:8)

def something(num:Int):Booleandef something[S](num:S):Boolean有不同的方法签名。第一个参数类型是Int。第二个参数类型是通用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
}

想象一下,尝试调用从something[S](num:S)继承的B方法:

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

如果你没有实现它,你会发生什么?

在第二个示例中,由于A继承B[Int],因此类通用S绑定到Int,因此A继承的方法是{ {1}},与实现的方法具有相同的签名。