我熟悉此错误消息,但在这种情况下我不太确定:
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
不应该是第一次编译吗?我在这里做错了什么,如何解决?
答案 0 :(得分:8)
def something(num:Int):Boolean
和def 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}},与实现的方法具有相同的签名。