scala - 在范围内显示时未找到隐式

考虑以下示例:

sealed trait ST

object ST{
  case class ST1() extends ST
  case class ST2() extends ST
}

trait TypeClass[A]{
  def doSome(a: A): Unit
}

case class Test[T](t: T)

implicit val tp: TypeClass[Test[_ <: ST]] = ???  //the implicit

def foo[A: TypeClass](a: A) = implicitly[TypeClass[A]].doSome(a)

val v: Test[_ <: ST] = ???

foo(v) //error: implicit not found

SCASTIE

可以看出,所需的隐式在范围内,但编译器无法识别。

为什么会发生这种情况,是否有调用 foo 的解决方法?

最佳答案

如果你改变foo(v)foo(v)(tp)它会(稍微)更好地解释为什么它不想使用 tp。

简而言之,def foo[A : TypeClass]想要隐式类型 TypeClass[A] . 当你做 foo(v) , A 变为 Test[_ <: ST]这意味着“Test 是一些特定ST 的未知子类型”。所以,foo想要一个隐含的那个特定类型。

但是tp 不是那个。它是“Test 的 TypeClass 或 ST任何子类”(显然 _ 在这两种情况下的意思略有不同,因为 v 是一个具体实例,必须具有特定类型)。

长话短说,Test[_ <: ST] 不是 v 的实际类型,而是其类型的父类(super class)型。所以,要让它工作,你只需要制作 TypeClass逆变( TypeClass[-A] ) - 这将使 foo接受 tp作为隐式,因为它的类型将是它期望的子类型。

https://stackoverflow.com/questions/67136631/

相关文章:

css - 在sass中混合两种颜色

string - 为什么 String::from(&str) 和 &str.to_string()

javascript - Mongoose 按 createdAt 排序

azure - 通过门户从 azure blob 容器下载多个文件,而不是一次下载一个文件

r - data.frame 中所有变量对的元素乘法总和

amazon-web-services - 使用 http post flutter web 时出现

awk - 拆分但保留分隔符很少

design-patterns - 使用字符串与枚举作为工厂方法的参数?

macos - MacOS M1 上的 Docker kafka 问题停留在配置上

python - 有没有一种好方法可以将函数累积应用于 pandas 系列字符串?