为什么这个Scala代码无法编译?

时间:2017-03-09 13:51:05

标签: scala

我不明白为什么这不编译。它抱怨哺乳动物类型的朋友没有谈话方法。但是有......

class Animal {
  def talk:String = "i am animal"
}
class Mammal extends Animal {
  override def talk:String = "i am mammal"
}
class Cow extends Mammal {
  override def talk:String = "moo"
}

trait Farm[+A] {
  def set[AA >: A](friend: AA): String
}
class CowFarm extends Farm[Cow] {
  override def set[Mammal >: Cow](friend: Mammal): String = friend.talk
}

1 个答案:

答案 0 :(得分:4)

set Mammal与您在上面声明的几行不同Mammal。它是一个本地泛型类型参数,它隐藏了现有的Mammal。因此,您的方法签名实际上与以下内容没有区别:

override def set[AA >: Cow](friend: AA): String = friend.talk

由于AACow的超类型,因此无法保证拥有talk方法。例如,它可以替换为AnyAnyRef