有一些解释here
类型和对象也可以有符号名称;特别是它应该是 提到对于具有两个类型参数的类型,可以写入名称 在参数之间,例如
Int <:< Any
与<:<[Int, Any]
相同。
但是,我仍然无法得到它。如果有人可以提供一个例子的解释,我会很感激。
答案 0 :(得分:1)
这是在对象Predef
中定义的类:
abstract class <:<[-From, +To] extends Function1[From, To]
A <:< B
证人A
是B
的子类型的实例。
类名是符号的,没有特别的后果,可以命名为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
,这只是一个简单的例子。)