【发布时间】: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、AnyRef、Any 等 - 因此,在这种情况下,需要推断出 B,为此目的编译器尝试在 Animal 和new Cat的所有类型之间找到 LUB,在这种情况下会推断出 Animal。
标签: scala generics covariance