List 在映射继承公共特征的具体对象列表时,Scala可以选择具体隐式吗?

List 在映射继承公共特征的具体对象列表时,Scala可以选择具体隐式吗?,list,scala,types,type-inference,implicit,List,Scala,Types,Type Inference,Implicit,在我昨天发布的上一篇文章的基础上进一步扩展 员工和经理都扩展了人员。我已经为这两个子类定义了隐式“转换器”对象 我还创建了一个类型为list[Product with Serializable with Person]的列表,其中包含每个具体类中的一个 import scala.reflect.ClassTag object Example { trait Person { def age: Int } case class Employee(age: Int) extends Pe

在我昨天发布的上一篇文章的基础上进一步扩展

员工
经理
都扩展了
人员
。我已经为这两个子类定义了隐式“转换器”对象

我还创建了一个类型为
list[Product with Serializable with Person]
的列表,其中包含每个具体类中的一个

import scala.reflect.ClassTag

object Example {
  trait Person { def age: Int }

  case class Employee(age: Int) extends Person
  case class Manager(age: Int) extends Person

  class Converter[T] { def convert(t: T) = (t,t) }

  def convert[T <: Person:ClassTag](p: T)(implicit converter: Converter[T]) =
    converter.convert(p)

  def main(args: Array[String]): Unit = {
    implicit val employeeConverter = new Converter[Employee]()
    implicit val managerConverter = new Converter[Manager]()

    convert(Employee(1)) // Works
    convert(Manager(2)) // Works

    List(Employee(3),Manager(4)) map(e => convert(e)) // Compile error
  }
}

我如何向Scala编译器保证我已经为
Person
的所有具体实现定义了隐式转换?

不,它不能。请看一下Scala文档

但是,如果由于类层次结构/继承而导致与隐式冲突,则将选择最具体的隐式冲突。所以,若经理是从员工那个里继承来的,那个么这个问题应该解决得很好


这里也有类似的帖子,

不,它不能。请看一下Scala文档

但是,如果由于类层次结构/继承而导致与隐式冲突,则将选择最具体的隐式冲突。所以,若经理是从员工那个里继承来的,那个么这个问题应该解决得很好


类似于这里的帖子,

您肯定需要特定的静态类型来选择隐式。这不是HList的作用吗?您肯定需要特定的静态类型来选择隐式。这不是HList的目的吗。
$ scalac Example.scala && scala Example
Example.scala:21: error: could not find implicit value for parameter converter: Example.Converter[Product with Serializable with Example.Person]
    List(Employee(3),Manager(4)) map(e => convert(e))