无法解析受约束的类类型参数的隐式
Posted
技术标签:
【中文标题】无法解析受约束的类类型参数的隐式【英文标题】:Can't resolve the implicit for a constrained class type parameter 【发布时间】:2021-08-22 19:13:17 【问题描述】:package ir.ashkan.shahnameh
object Implicit
sealed trait A
class B extends A
class C extends A
def listOf[T <: A](implicit ts: List[T]): List[T] = ts
class Module[T <: A]
implicit val bList: List[B] = ???
implicit val cList: List[C] = ???
listOf[T].toSet // HERE
编译失败:
could not find implicit value for parameter ts: List[T] (No implicit view available from Int => T.)
[error] listOf[T].toSet
[error] ^
【问题讨论】:
T
可能是 Nothing
可能是 B with C
可能是 C with A
可能是 B
或 C
的另一个子类型 - 因此,不能保证会有范围内的隐式 List[T]
。你能做的最好的就是class Module[T <: A](implicit ev: List[T])
并将这两个隐式 val 移动到 Module
的伴随对象我相信它们应该在隐式范围内。
【参考方案1】:
Module
需要隐式 List[T]
。您可以为其定义隐式构造函数参数:
object Implicit
sealed trait A
class B extends A
class C extends A
def listOf[T <: A](implicit ts: List[T]): List[T] = ts
implicit val aList: List[A] = List.empty[A]
implicit val bList: List[B] = List.empty[B]
class Module[T <: A](implicit ts: List[T])
listOf[T].toSet
val x = new Implicit.Module[Implicit.B]
【讨论】:
以上是关于无法解析受约束的类类型参数的隐式的主要内容,如果未能解决你的问题,请参考以下文章