有人可以解释为什么以下示例代码无法编译
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
我确信我遗漏了一些显而易见的东西,但我们将非常感谢任何帮助
答案 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