A<:< SomeType参数声明

时间:2016-08-14 14:41:35

标签: scala function

查看scala.Option[T]来源,我发现了以下隐式参数声明implicit ev: Null <:< A1。自己尝试一下

class Test[T](val i: Int){
  def test(p: T <:< Option[Int]) = 1
}

我发现p看起来像Function1。它有applyandThen等方法。如果我们写下来会有什么不同:

class TestMatch[T](val i: Int){
    def test(p: T <:< Option[Int]) =  //..
    def test2(p: T => Option[Int]) =  //...
}

testtest2的单身之间是否存在一些主要区别?这个例子是这样的:

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

2 个答案:

答案 0 :(得分:3)

  

我发现p看起来像Function1

<:<定义为:

sealed abstract class <:<[-From, +To] extends (From => To) with Serializable

哪个是Function1[From, To]的派生,以及您applyandThen的来源。 <:<表示通用参数类型约束,其中TOption[Int]的子类型。

通常,<:<用作类型约束,强制隐式证据在范围内:

  

A <:< B证人的实例,AB的子类型。   要求类型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中,您声明TOption[Int]的子类型。在test2中没有这样的约束。