从 scala 中的泛型类继承



谁能解释为什么以下示例代码无法编译

class Animal(val mass : Int)
class Person(val personMass :Int,val name:String) extends Animal(personMass)
class SocialGroup[T <: Animal]
class AlturisticSocialGroup[T <: Animal ] extends SocialGroup[T]
class Society[A <: SocialGroup[B]]

这里的想法是,我想要一个由社会群体的一个子类参数化的社会。我希望能够做

val animalSociety : Society[SocialGroup[Animal]] = ......

val niceSociety = Society[AltruisticSocialGroup[Person]] = ....

编译器给了我

错误: 未找到: 类型 B

我确定我错过了一些明显的东西,但任何帮助将不胜感激

你需要这个吗?

class Society[A <: SocialGroup[B], B <: Animal]

以便您可以使用

val animalSociety: Society[SocialGroup[Animal], Animal] = ...
val niceSociety: Society[AltruisticSocialGroup[Person], Person] = ...

你需要类型参数AB,所以基本上你需要像class ClassName[A, B]这样具有适当属性的东西。

编辑:
就像@Kigyo说的,如果你不需要对B进行额外的限制,你可以使用匿名类型参数_

class Society[A <: SocialGroup[_]]

这将用通配符_替换B,这反过来又_ <: Animal由于定义SocialGroup[T <: Animal],并且_不需要声明,因为它没有名称,所以代码会更短。

val animalSociety: Society[SocialGroup[Animal]] = ...
val niceSociety: Society[AltruisticSocialGroup[Person]] = ...

您可以在 https://twitter.github.io/scala_school/type-basics.html 中看到更多解释

有时你不在乎能够命名一个类型变量,对于 例:

scala> def count[A](l: List[A]) = l.size count: [A](List[A])Int

相反,您可以使用"通配符":

scala> def count(l: List[_]) = l.size count: (List[_])Int

最新更新