Scala是什么<:<操作者

时间:2015-11-25 23:46:32

标签: scala

有一些解释here

  

类型和对象也可以有符号名称;特别是它应该是       提到对于具有两个类型参数的类型,可以写入名称       在参数之间,例如Int <:< Any<:<[Int, Any]相同。

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

1 个答案:

答案 0 :(得分:1)

这是在对象Predef中定义的类:

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

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

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

你得到了证据&#39;这个类的实例通过Predef.$conforms

implicit def $conforms[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
}

在使用网站中,编译器只允许我们在succeeds时调用A <: Int,否则我们将无法获取ev参数。隐式查找是有效的,因为编译器可以根据From的类型参数To<:<的方差推断所搜索类型的上限。

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