【问题标题】:Scala type bounds =:=Scala 类型边界 =:=
【发布时间】:2015-05-12 20:59:10
【问题描述】:

编译时:

  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)
  }

为什么?

【问题讨论】:

    标签: scala type-bounds


    【解决方案1】:

    实际上,您的类型约束是向后的。 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 的隐式转换。

    【讨论】:

      【解决方案2】:

      哦,问题可能是函数的逆变换。现在可以了:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-25
        • 2021-01-24
        • 2020-07-22
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        • 2020-10-14
        相关资源
        最近更新 更多