Scala什么是<:<运算符

普拉蒂克·哈德洛亚(Pratik Khadloya)

有一些解释这里

类型和对象也可以具有符号名。特别要指出的是,对于具有两个类型参数的类型,名称可以写在参数之间,例如Int <:< Any与相同<:<[Int, Any]

但是,我还是不太明白。如果有人可以提供示例解释,我将不胜感激。

0__

这是在object中定义的类Predef

abstract class <:<[-From, +To] extends Function1[From, To]

是的子类型的A <:< B见证人实例AB

类名是象征性的,没有特别的意义,可以将其命名为IsSubType[From, To]aka From IsSubType To

您可以通过以下方式获得此类的“证据”实例Predef.$conforms

implicit def $conforms[A]: <:<[A, A]

这种情况的用例是您有一个类型,A但您想对sub-type进行操作B <: A然后,您可以简单地要求以下隐式证据:

trait Foo[A] {
  def x: A

  // def fails: Int = x * x -- not possible, we don't know that A is an Int

  def succeeds(implicit ev: A <:< Int): Int = x * x
}

从使用站点,编译器仅允许我们调用succeedsif A <: Int,因为否则我们将无法获取ev参数。隐式的查找工作,因为编译器可以推断出如何基于该类型参数的方差寻求型的上限FromTo<:<

(当然Int是最终类型,因此我们也可以要求相等A =:= Int,这只是一个简单的示例。)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章