【问题标题】: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 的伴随对象我相信它们应该在隐式范围内。

标签: scala implicit type-parameter


【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2011-04-18
    相关资源
    最近更新 更多