Scala中具有抽象类型的F界多态

劳伦斯·瓦格菲尔德

我已经阅读了几篇文章,这些文章表达了应使用抽象类型在Scala中实现f界多态性。这主要是为了减轻类型推断问题,而且还消除了在定义递归类型时类型参数似乎引入的二次增长。

这些定义如下:

trait EventSourced[E] {
  self =>

  type FBound <: EventSourced[E] { type FBound <: self.FBound }

  def apply(event: E): FBound
}

但是,这似乎引入了两个问题:

1)每次用户想要引用此类型的对象时,他们还必须引用FBoundtype参数。这感觉像代码气味:

def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...

2)编译器现在无法推断上述方法的类型参数,并显示以下消息:

Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound

有没有人在他们的解决方案中成功使用f界多态性实现,从而使编译器仍然能够推断类型?

劳伦斯·瓦格菲尔德

从那以后,我意识到在大多数情况下应该避免f界多态性,或者更确切地说,通常应该选择一种替代设计。要了解如何避免它,我们首先需要知道是什么使我们需要它:

当一个类型期望在派生类型中引入重要的接口更改时,就会发生F界多态性

通过组成预期的更改区域而不是尝试通过继承来支持它们,可以避免这种情况这实际上可以归结为四种设计模式的组合:

赞成“对象组成”胜于“类继承”

-(四人帮,1995)

例如:

trait Vehicle[V <: Vehicle[V, W], W] {
    def replaceWheels(wheels: W): V
}

变成:

trait Vehicle[T, W] {
    val vehicleType: T
    def replaceWheels(wheels: W): Vehicle[T, W]
}

这里,“预期的改变”是车辆类型(例如BikeCarLorry)。前面的示例假定将通过继承来添加,这需要一个f边界类型,该类型使对W使用Vehicle的任何函数无法进行推断使用合成的新方法不会出现此问题。

参见:https : //github.com/ljwagerfield/scala-type-in​​ference/blob/master/README.md#avoiding-f-bounded-polymorphism

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala中的F界多态返回类型?

来自分类Dev

使用具有抽象类型的 Scala 数组

来自分类Dev

Scala中具有构造函数参数的抽象类

来自分类Dev

具有返回不同类型子项的抽象类中的C#抽象方法

来自分类Dev

具有抽象类类型和访问子级的Scala列表

来自分类Dev

如何在具有抽象类型变量的基本特征中反映Scalavro联合类型?

来自分类Dev

为具有TypeScript中类型变量的抽象类的派生类分配通用类型

来自分类Dev

Scala 中的抽象类型、变量和类型类

来自分类Dev

Scala抽象类型成员

来自分类Dev

Scala中涉及抽象类型时没有动态绑定吗?

来自分类Dev

在Dozer中映射具有抽象类型成员的类时,InstantiationException

来自分类Dev

抽象类是否可以具有其他抽象类的返回类型的方法?

来自分类Dev

Scala中通用抽象类型的模式匹配

来自分类Dev

F界多态类型和非泛型子类型的现有类型?

来自分类Dev

R中的抽象类型

来自分类Dev

Scala抽象类中的私有构造函数?

来自分类Dev

Scala抽象类中的私有构造函数?

来自分类Dev

phpunit中具有受保护方法的抽象类

来自分类Dev

C ++ / Qt中具有泛型的抽象类

来自分类Dev

抽象类中的 ModelAttribute 具有来自子类的值

来自分类Dev

什么是TypeScript中的F界多态

来自分类Dev

具有隐式类型标记的Scala模拟多态方法

来自分类Dev

如何在Scala中反映与抽象类型的类型参数相对应的具体类型?

来自分类Dev

在scala中,如何使抽象类型的内部类型对不同实例保持不变?

来自分类Dev

Scala:使用类型参数或抽象类型作为类型界限

来自分类Dev

实现抽象类的类中的多态函数

来自分类Dev

GORM多态性中的抽象类

来自分类Dev

具有@XmlTransient的JAXB抽象类

来自分类Dev

C ++中的模板:(F-)有界多态性

Related 相关文章

  1. 1

    Scala中的F界多态返回类型?

  2. 2

    使用具有抽象类型的 Scala 数组

  3. 3

    Scala中具有构造函数参数的抽象类

  4. 4

    具有返回不同类型子项的抽象类中的C#抽象方法

  5. 5

    具有抽象类类型和访问子级的Scala列表

  6. 6

    如何在具有抽象类型变量的基本特征中反映Scalavro联合类型?

  7. 7

    为具有TypeScript中类型变量的抽象类的派生类分配通用类型

  8. 8

    Scala 中的抽象类型、变量和类型类

  9. 9

    Scala抽象类型成员

  10. 10

    Scala中涉及抽象类型时没有动态绑定吗?

  11. 11

    在Dozer中映射具有抽象类型成员的类时,InstantiationException

  12. 12

    抽象类是否可以具有其他抽象类的返回类型的方法?

  13. 13

    Scala中通用抽象类型的模式匹配

  14. 14

    F界多态类型和非泛型子类型的现有类型?

  15. 15

    R中的抽象类型

  16. 16

    Scala抽象类中的私有构造函数?

  17. 17

    Scala抽象类中的私有构造函数?

  18. 18

    phpunit中具有受保护方法的抽象类

  19. 19

    C ++ / Qt中具有泛型的抽象类

  20. 20

    抽象类中的 ModelAttribute 具有来自子类的值

  21. 21

    什么是TypeScript中的F界多态

  22. 22

    具有隐式类型标记的Scala模拟多态方法

  23. 23

    如何在Scala中反映与抽象类型的类型参数相对应的具体类型?

  24. 24

    在scala中,如何使抽象类型的内部类型对不同实例保持不变?

  25. 25

    Scala:使用类型参数或抽象类型作为类型界限

  26. 26

    实现抽象类的类中的多态函数

  27. 27

    GORM多态性中的抽象类

  28. 28

    具有@XmlTransient的JAXB抽象类

  29. 29

    C ++中的模板:(F-)有界多态性

热门标签

归档