Lea*_*ner 3 generics collections scala scala-collections
我很困惑如何在Scala中解决这个问题.在Java中,我放弃了泛型或使用强制转换,但Scala比这更严格.这就是我所拥有的.
Factory[+F <: Factory[F]]和一些与此无关的具体实现.这是协变的.这个类有一个创建产品的方法 - 见下一点.Product[+F <: Factory[F]],表示工厂的产品.这些也是协变和只读的.任何特定工厂只生产一种产品(即没有多种不同的子类型--FooFactory生产FooProduct,BarFactory生产BarProduct等)Iterable[Factory[_]].这是麻烦的第一部分.Scala似乎在_这里理解为Any,无视F <: Factory[F]对类型本身的约束.Map[Factory[_],Product[_]]和尝试Map[Factory[_],Product[Factory[_]]].这是我遇到麻烦的另一部分.第一个_与第二个没有联系_,两者似乎都暗示为Any.我不能做的是创建该地图.它可能或不重要,但我通过使用另一种看起来像语法结构的方法来做(并且必须这样做).它来自一个特点:
gather[B](fun: A => B): Map[A,B]获取工厂集合的声明方法(在此处调用,未在特征本身中实现并通常键入).实际的工厂类型是通用的和未知的.MapF到P 的不可变量编译器的问题不在于'gather'方法,而是在调用它的代码中.我无法将其结果转换为Map[Factory[_],Product[_]]因为_ F <: Factory[F]在任何一个地方都不符合...我会非常乐意使用基类型_,但那就是Factory[Factory[Factory[Factory......(infinitely many times)]]]]]]....并且我不知道该怎么做.
请帮忙!
学习者
大多数情况下,_除非你知道自己在做什么,否则在类型中使用是不对的.如果你不理解存在类型,那么你肯定不知道你在做什么.这并不是说斯卡拉认为_就是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)
| 归档时间: |
|
| 查看次数: |
794 次 |
| 最近记录: |