3

为什么 Scala 中的 f 有界多态性通常使用上限类型self 类型来实现

trait MyTrait[A <: MyTrait[A]] { self: A =>
  …
}

不仅仅是像这样的自我类型

trait MyTrait[A] { self: A =>
  …
}

第一个示例中的上限类型似乎是不必要的。至少我找不到使用一个的任何好处。我在这里忽略了什么吗?然而,类型边界确实妨碍了诸如

def func[A](implicit ev: A <:< MyTrait[A]) = ???

(当然,在这个简单而人为的示例中,afunc[A <: MyTrait[A]]可以解决问题,但在更复杂的环境中可能无法实现)

我发现 f-bounded polymorphism 在多个库中使用类型绑定实现甚至在关于该主题的介绍性博客文章中(https://tpolecat.github.io/2015/04/29/f-bounds.html)我想知道如果最好省略一般绑定的类型。

4

1 回答 1

3

因此, 的想法trait MyTrait[A <: MyTrait[A]] { self: A => ... }是强制A成为当前实现的类型。

如果你省略了上界,那么除了Foo不能对它的类型参数做很多事情(它对它的成员一无所知)之外,你还可以做这样的事情,这不是很有用。

   trait Foo[A] { self: A => }
   trait Bar 
   class Baz extends Foo[Bar] with Bar

甚至只是class Bat extends Foo[Any]

于 2021-05-24T12:21:27.403 回答