gpt4 book ai didi

generics - Scala 中泛型集合的问题

转载 作者:行者123 更新时间:2023-12-01 23:08:45 24 4
gpt4 key购买 nike

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

  1. 抽象基类 Factory[+F <: Factory[F]]以及一些与这里无关的具体实现。这是协变的。这个类有一个创建产品的方法 - 见下一点。
  2. 抽象基类 Product[+F <: Factory[F]]代表工厂的产品。这些也是协变的和只读的。任何特定的工厂都只生产一种类型的产品(即没有多种不同的子类型 - FooFactory 生产 FooProduct,BarFactory 生产 BarProduct,等等)
  3. 我必须有一个包含具体实例的工厂集合(Capt. Obvious 在这里发言)。目前这是 Iterable[Factory[_]] .这是麻烦的第一部分。 Scala 似乎明白 _此处为 Any ,忽略约束 F <: Factory[F]类型本身。
  4. 我有一个聚合工厂方法,它要求每个工厂在给定相同参数的情况下生产其产品。结果是工厂对其产品的 map ,目前编码为 Map[Factory[_],Product[_]]也试过Map[Factory[_],Product[Factory[_]]] .这是我遇到麻烦的另一部分。第一个_与第二个 _ 取消链接并且两者似乎都被暗示为 Any .

我不能做的是创建那张 map 。它可能重要,也可能不重要,但我通过使用另一种看起来像语法结构的方法来做到这一点(并且必须这样做)。它来自一个特质,并且:

  1. 调用获取工厂集合的已声明方法(此处称为 gather[B](fun: A => B): Map[A,B],未在 trait 本身中实现且一般类型化)。实际的工厂类型是通用的且未知的。
  2. 遍历该通用集合并执行传递给它的函数。这个函数实际上是调用工厂方法。
  3. 返回一个不可变的 Map从 F 到 P

编译器的问题不是在“收集”方法上,而是在调用它的代码上。我无法将其结果转换为 Map[Factory[_],Product[_]]因为 _ 不符合 F <: Factory[F]在任何一个地方...我都非常乐意为 _ 使用基本类型, 但那是 Factory[Factory[Factory[Factory......(infinitely many times)]]]]]]....我不知道该怎么办。

请帮忙!

学习者

最佳答案

大多数时候,使用 _除非您知道自己在做什么,否则 in types 是错误的做法。如果你不了解存在类型,那么你肯定不知道自己在做什么。不是 Scala 认为 _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
}

关于generics - Scala 中泛型集合的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6359929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com