【发布时间】:2020-11-05 11:02:31
【问题描述】:
我有以下问题,我对发生的事情感到困惑:
- 我有一个隐式定义的优先级
- 我使用此优先级隐式来施加上下文限制
- 我声明了一个带有默认字段的案例类,该字段的值被上下文绑定所覆盖
- 我仍然收到类型错误
反映我正在处理的实际代码的最小工作示例。我基本上需要在我的代码的其他部分隐含优先级:
// 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]
这里发生了什么?我推断,由于我在边界内创建默认参数,因此类型应该匹配。我是否遗漏了一些技巧来完成这项工作?
【问题讨论】:
-
@finite_diffidence 你的代码不是MCRE 因为它编译了scastie.scala-lang.org/W4jDvvnjSIu1JwSvw3yJrA 如何重现你的编译错误?
-
道歉 Dmytro,似乎我的 IDE 在屏幕上显示错误,我在示例中添加了一行,但它引发了关于未找到隐式的不同错误 - 我认为该错误与无法提供证据。
-
@user 如果有人希望位置是 List[String] 怎么办? 这将是调用站点上的编译错误,而不是定义站点上的编译错误。
-
@user 您也许可以使用
implicitly[List[T0]]并提供List[Int]等的隐式值。 像List[...]这样的标准类型的隐式确实是个坏主意. -
@DmytroMitin 我并不是说
implicitly[List[T0]]是一个好的解决方案,只是你可以将它用作创可贴。不过,我不知道您可以提供这样的默认参数。我现在删除了我的评论。
标签: scala generics implicit-conversion context-bound