具有优先级隐含的上下文边界的类型错误
Type Error for Context Bounding with Priority Implicits
我有以下问题,我对发生了什么感到困惑:
- 我有一个隐式定义的优先级
- 我使用这个隐含的优先级来强加上下文绑定
- 我用默认字段声明了一个案例 class,它的值被上下文绑定覆盖
- 我仍然遇到类型错误
一个最小的工作示例,反映了我正在处理的实际代码。我基本上需要在代码的其他部分隐含优先级:
// 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]
这是怎么回事?我的理由是,因为我在边界内创建我的默认参数,所以类型应该匹配。我是否遗漏了一些技巧来完成这项工作?
不清楚如何重现您的编译错误
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
我有以下问题,我对发生了什么感到困惑:
- 我有一个隐式定义的优先级
- 我使用这个隐含的优先级来强加上下文绑定
- 我用默认字段声明了一个案例 class,它的值被上下文绑定覆盖
- 我仍然遇到类型错误
一个最小的工作示例,反映了我正在处理的实际代码。我基本上需要在代码的其他部分隐含优先级:
// 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]
这是怎么回事?我的理由是,因为我在边界内创建我的默认参数,所以类型应该匹配。我是否遗漏了一些技巧来完成这项工作?
不清楚如何重现您的编译错误
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