0

我有以下问题,我对发生的事情感到困惑:

  1. 我有一个隐式定义的优先级
  2. 我使用此优先级隐式来强加上下文绑定
  3. 我声明了一个带有默认字段的案例类,该字段的值被上下文绑定所覆盖
  4. 我仍然收到类型错误

一个反映我正在处理的实际代码的最小工作示例。我基本上需要在我的代码的其他部分隐含优先级:

    // priority implicits
    sealed trait Stringifier[T] {
      def stringify(lst: List[T]): String
    }
    
    trait Int_Stringifier {
      implicit object IntStringifier {
        def stringify(lst: List[Int]): String = lst.toString()
      }
    }
    
    object Double_Stringifier extends Int_Stringifier {
      implicit object DoubleStringifier extends Stringifier[Double] {
        def stringify(lst: List[Double]): String = lst.toString()
      }
    }
    
    object Example extends App {
    
      trait Animal[T0] {
        def incrementAge(): Animal[T0]
      }
    
      case class Dog[T0: Stringifier]
      (age: Int = 0, locations: List[T0] = List(1, 2, 3)) extends Animal[String] {
        def incrementAge(): Dog[T0] = this.copy(age = age + 1)
      }
    }
 val t = Dog(age = 100)

我收到类型不匹配错误:

required List[T0]

found List[Int]

这里发生了什么?我推断,由于我在边界内创建默认参数,因此类型应该匹配。我在这里错过了一些技巧来完成这项工作吗?

4

1 回答 1

1

目前尚不清楚如何重现您的编译错误

required List[T0]

found List[Int]

您添加的代码

val t = Dog(age = 100)

产生不同的错误

Error: could not find implicit value for evidence parameter of type App.Stringifier[Int]
Error occurred in an application involving default arguments.
    val t = Dog(age = 100)

这是因为你错过extends Stringifier[Int]import Double_Stringifier._

trait Int_Stringifier {
  implicit object IntStringifier extends Stringifier[Int] {
    def stringify(lst: List[Int]): String = lst.toString()
  }
}

import Double_Stringifier._

val t = Dog(age = 100) // compiles
于 2020-07-15T21:08:22.977 回答