谁能解释为什么以下示例代码无法编译
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] = ...
你需要类型参数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