继承scala中的泛型类

时间:2014-08-22 04:33:03

标签: scala generics inheritance

有人可以解释为什么以下示例代码无法编译

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]]

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

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

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

编译器给了我

  

错误:未找到:输入B

我确信我遗漏了一些显而易见的东西,但我们将非常感谢任何帮助

1 个答案:

答案 0 :(得分:3)

你需要这个吗?

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

这样你就可以使用

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

您需要输入参数A B,所以基本上您需要具有适当属性的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