无法解析受约束的类类型参数的隐式

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 可能是 BC 的另一个子类型 - 因此,不能保证会有范围内的隐式 List[T]。你能做的最好的就是class Module[T &lt;: 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]

【讨论】:

以上是关于无法解析受约束的类类型参数的隐式的主要内容,如果未能解决你的问题,请参考以下文章

如何确定两个优先于重载解析的隐式转换序列?

使用隐式类型证据来满足类型约束

Scala零基础教学61-80

Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值

没有 Encoder[Row] 类型的隐式参数

找不到参数的隐式值