Scala类型bounds =:=

时间:2015-05-12 05:43:06

标签: scala type-bounds

虽然这可以编译:

  implicit class Container[T](val value:T) extends AnyVal{
    def addInt(x:Int)(implicit ev:T=:=Int) = value+x
  }

这会抱怨类型不匹配,预期T,实际Int,就好像忽略了类型绑定一样。

  implicit class Container[T](val value:T=>Int) extends AnyVal{
    def addInt(x:Int)(implicit ev:T=:=Int) = value(x)
  }

为什么?

2 个答案:

答案 0 :(得分:2)

实际上,你的类型约束是倒退的。 T =:= Int提供了隐式证据,表明TInt,但不完全 IntT。如果您查看=:=的声明,您会发现它只有一种方式:

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

您的第一个示例有效,因为valueT,约束是T =:= Int,隐式地将T转换为Int。但是对于第二个示例,我们需要将T提供给value: T => Int,因此我们需要另一个方向。

这有效:

implicit class Container[T](val value: T => Int) extends AnyVal {
    def addInt(x: Int)(implicit ev: Int =:= T) = value(x)
}

使用Int <:< T的第二个示例也有效的原因是<:<提供了Int => T的隐式转换。

答案 1 :(得分:0)

哦可能问题是函数的反差。这现在有效:

<activity
     android:name="Your_Activity"
     android:configChanges="orientation"
     android:screenOrientation="landscape" />