有一些解释这里
类型和对象也可以具有符号名。特别要指出的是,对于具有两个类型参数的类型,名称可以写在参数之间,例如
Int <:< Any
与相同<:<[Int, Any]
。
但是,我还是不太明白。如果有人可以提供示例解释,我将不胜感激。
这是在object中定义的类Predef
:
abstract class <:<[-From, +To] extends Function1[From, To]
是的子类型的
A <:< B
见证人实例。A
B
类名是象征性的,没有特别的意义,可以将其命名为IsSubType[From, To]
aka From IsSubType To
。
您可以通过以下方式获得此类的“证据”实例Predef.$conforms
:
implicit def $conforms[A]: <:<[A, A]
这种情况的用例是您有一个类型,A
但您想对sub-type进行操作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
if A <: Int
,因为否则我们将无法获取ev
参数。隐式的查找工作,因为编译器可以推断出如何基于该类型参数的方差寻求型的上限From
和To
的<:<
。
(当然Int
是最终类型,因此我们也可以要求相等A =:= Int
,这只是一个简单的示例。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句