2015-11-25 29 views
0

有一些解释here斯卡拉是什么<<运营商

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

但是,我还是不太明白。我会很感激,如果有人可以提供一个例子的解释。

+1

对于初学者来说,这是一个类型,而不是运营商。 –

+0

[Scala标点符号(又名符号和运算符)]可能的重复](http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators) – emlai

+0

该帖子不讨论'<: ' –

回答

1

这是在对象Predef定义的类:

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

A <:< B证人即AB一个亚型的实例。

该类名是符号没有特别的后果,它可能已被命名为IsSubType[From, To]又名From IsSubType To

您通过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参数。由于编译器可以基于类型参数FromTo的的方差推断查找类型的上限,所以隐式查找是有效的。

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