Scala中的泛型集合有问题

Lea*_*ner 3 generics collections scala scala-collections

我很困惑如何在Scala中解决这个问题.在Java中,我放弃了泛型或使用强制转换,但Scala比这更严格.这就是我所拥有的.

  1. 一个抽象基类Factory[+F <: Factory[F]]和一些与此无关的具体实现.这是协变的.这个类有一个创建产品的方法 - 见下一点.
  2. 一个抽象基类Product[+F <: Factory[F]],表示工厂的产品.这些也是协变和只读的.任何特定工厂只生产一种产品(即没有多种不同的子类型--FooFactory生产FooProduct,BarFactory生产BarProduct等)
  3. 我必须有一个包含具体实例的工厂集合(Capt.明显在这里说).现在这是Iterable[Factory[_]].这是麻烦的第一部分.Scala似乎在_这里理解为Any,无视F <: Factory[F]对类型本身的约束.
  4. 我有一个聚合工厂方法,要求每个工厂生产给出相同参数的产品.结果是工厂到他们的产品的地图,目前编码Map[Factory[_],Product[_]]和尝试Map[Factory[_],Product[Factory[_]]].这是我遇到麻烦的另一部分.第一个_与第二个没有联系_,两者似乎都暗示为Any.

我不能做的是创建该地图.它可能或不重要,但我通过使用另一种看起来像语法结构的方法来做(并且必须这样做).它来自一个特点:

  1. 调用gather[B](fun: A => B): Map[A,B]获取工厂集合的声明方法(在此处调用,未在特征本身中实现并通常键入).实际的工厂类型是通用的和未知的.
  2. 迭代该泛型集合并执行传递给它的函数.这个函数实际上是调用工厂方法的.
  3. 返回MapF到P 的不可变量

编译器的问题不在于'gather'方法,而是在调用它的代码中.我无法将其结果转换为Map[Factory[_],Product[_]]因为_ F <: Factory[F]在任何一个地方都不符合...我会非常乐意使用基类型_,但那就是Factory[Factory[Factory[Factory......(infinitely many times)]]]]]]....并且我不知道该怎么做.

请帮忙!

学习者

Dan*_*ral 5

大多数情况下,_除非你知道自己在做什么,否则在类型中使用是不对的.如果你不理解存在类型,那么你肯定不知道你在做什么.这并不是说斯卡拉认为_就是Any,那就是它知道 _可以代表任何东西-无论是Any,Nothing或任何之间.

总结一下,就Iterable[Factory[_]]意味着Iterable[Factory[T]] forSome { type T }.您可以明确地编写它Iterable[Factory[T]] forSome { type T <: Factory[T] }以获得所需的约束,就像您可以将其编写一样Map[Factory[T], Product[T]] forSome { type T <: Factory[T] }.

不过,我不确定这是否真的是你需要的.您的问题主要集中在如何解决问题,而不是专注于如何解决问题.例如,可能更好的是使用以下代替泛型:

abstract class Factory {
    type T <: Factory
}
Run Code Online (Sandbox Code Playgroud)