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))