斯卡拉什么是<:<运营商

这里有一些解释

类型和对象也可以具有符号名称; 特别值得一提的是,对于具有两个类型参数的类型,可以在参数之间写入名称,以便例如Int <:< Any<:<[Int, Any]

但是,我仍然无法得到它。 我会很感激,如果有人可以提供一个例子的解释。


这是在对象Predef定义的类:

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

A <:< B一个实例证明AB一个子类型。

类名是符号的没有特别的后果,它可以被命名为IsSubType[From, To] aka From IsSubType To

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

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

这个用例就是你有A类型A但是你想在子类型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
}

从使用地点来看,如果A <: Int ,编译器只允许我们调用succeeds ,否则我们将无法获取ev参数。 由于编译器可以基于类型参数FromTo <:<的方差来推断所搜索类型的上限,所以隐式查找是有效的。

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

链接地址: http://www.djcxy.com/p/72853.html

上一篇: Scala what is <:< operator

下一篇: What does this sign "<:" mean in scala?