【问题标题】:scala type system - understanding covariant with lower/upper boundsscala 类型系统 - 理解具有下限/上限的协变
【发布时间】:2020-03-29 12:52:51
【问题描述】:

我是 scala 新手,对 scala 泛型有疑问

问题是 animalContainer.add 方法如何接受新的 Cat。据我了解 B>:A - A 是动物,B 是猫。 猫不是动物的超级类型。它是如何工作的..

【问题讨论】:

  • 我认为它不明显的原因是你还没有真正实现你的add 方法。当你这样做时,你会看到编译器只允许你创建一个 Container[B] 的新实例以使其工作,当你创建一个新容器时,它将是 Container[Animal],而不是 Container[Dog] .
  • B 不会被推断为Cat,而是Animal
  • 感谢您的回复。当鼠标悬停时,我得到 def add[B >: Animal](element: B): Unit - 我正在将新 Cat 传递给 add 方法.. 怎么可能 cat>:Animal .. 你能用外行术语解释一下吗
  • 您需要了解一个值有多种类型而不仅仅是一种,因此new Cat(其中) 类型 Cat、Animal、AnyRefAny 等 - 因此,在这种情况下,需要推断出 B,为此目的编译器尝试在 Animalnew Cat 的所有类型之间找到 LUB,在这种情况下会推断出 Animal

标签: scala generics covariance


【解决方案1】:

B 不是猫,B 是动物。然后推断的 add 类型有效:

def add(element: Animal)

你可以在这里传递 Cat,因为 Cat 扩展了 Animal。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多