斯卡拉什么是<:<运营商
这里有一些解释
类型和对象也可以具有符号名称; 特别值得一提的是,对于具有两个类型参数的类型,可以在参数之间写入名称,以便例如Int <:< Any
与<:<[Int, Any]
。
但是,我仍然无法得到它。 我会很感激,如果有人可以提供一个例子的解释。
这是在对象Predef
定义的类:
abstract class <:<[-From, +To] extends Function1[From, To]
A <:< B
一个实例证明A
是B
一个子类型。
类名是符号的没有特别的后果,它可以被命名为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
参数。 由于编译器可以基于类型参数From
和To
<:<
的方差来推断所搜索类型的上限,所以隐式查找是有效的。
(当然, Int
是最终的类型,所以我们也可以要求平等A =:= Int
,这只是一个简单的例子。)