【问题标题】:Context bounds with two generic parameters具有两个通用参数的上下文边界
【发布时间】:2013-11-21 20:50:49
【问题描述】:

在 Scala 中,我可以使用上下文边界:

def sort[T : Ordered](t: Seq[T])

意思是一样的:

def sort[T](t: Seq[T])(implicit def Ordered[T])

如果我有一个有两个泛型参数的类怎么办。 IE。我希望能够确保我有一个Writer[T, String]。有没有一种语法可以让我使用上下文边界 (T : ...) 或者我需要显式地使用隐式(写起来很有趣)。

【问题讨论】:

    标签: scala implicits


    【解决方案1】:

    是的,这是可能的!但不是很漂亮:

    trait Writer[T, O] {
      def write(t: T): O
    }
    
    def writeToString[T: ({ type L[x] = Writer[x, String] })#L](t: T) =
      implicitly[Writer[T, String]].write(t)
    
    implicit object intToStringWriter extends Writer[Int, String] {
      def write(t: Int) = t.toString
    }
    

    然后:

    scala> writeToString(1)
    res0: String = 1
    

    ({ type L[x] = Writer[x, String] })#L 被称为type lambda。有时它们非常方便(如果buggy),但这绝对不是其中之一。使用显式隐式会更好。

    【讨论】:

    • 我会坚持显式隐式!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多