查看scala.Option[T]
来源,我发现了以下隐式参数声明implicit ev: Null <:< A1
。自己尝试一下
class Test[T](val i: Int){
def test(p: T <:< Option[Int]) = 1
}
我发现p
看起来像Function1
。它有apply
,andThen
等方法。如果我们写下来会有什么不同:
class TestMatch[T](val i: Int){
def test(p: T <:< Option[Int]) = //..
def test2(p: T => Option[Int]) = //...
}
test
和test2
的单身之间是否存在一些主要区别?这个例子是这样的:
tm.test2(x => { //fine
println(x)
Some(x)
})
tm.test(x => { //Compile error
println(x)
Some(x)
})
我也试过这个:
tm.test(x <:< { //Compile error
println(x)
Some(x)
})
但它也没有用。如何使用test
?
答案 0 :(得分:3)
我发现
p
看起来像Function1
<:<
定义为:
sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
哪个是Function1[From, To]
的派生,以及您apply
和andThen
的来源。 <:<
表示通用参数类型约束,其中T
是Option[Int]
的子类型。
通常,<:<
用作类型约束,强制隐式证据在范围内:
A <:< B
证人的实例,A
是B
的子类型。 要求类型A <:< B
的隐式参数对广义约束A <: B
进行编码。
但是你无法解释是谁创造了这个隐含的&lt;:&lt;参数? 它从哪里来的?我猜编译器了解&lt;:&lt;并且知道 怎么做呢
在您的示例中,没有创建隐式证据。您只是将<:<
用作类型,而不是约束。如果你想创建一个,你需要通过声明隐含的来自己做:
def greaterThan[T](x: T, y: T)(implicit ev: T <:< Ordered[T]): Boolean = x > y
答案 1 :(得分:1)
他们有不同的语义。在test
中,您声明T
是Option[Int]
的子类型。在test2
中没有这样的约束。