Scala如何在伴生对象中添加隐式方法转换不同样例类?
问题解答
你的写法不可行,原因是你定义的implicit def toStudent是隐式转换函数,它的作用是让编译器在需要Student类型的场景下自动把Member实例转换为Student,但并不会给Member类添加toStudent这个实例方法,所以直接调用newMember.toStudent会编译报错。
要实现newMember.toStudent这种调用方式,正确的做法是用Scala扩展方法(Implicit Class),把它定义在Member的伴生对象里即可:
case class Student( name: String, age: Option[Int] = None, id: String ) case class Member( id: String, `type`: String, name: String ) object Member { // 定义扩展方法,给Member实例添加toStudent方法 implicit class MemberToStudentOps(member: Member) { def toStudent: Student = Student(member.name, None, member.id) } } // 调用示例 val newMember = Member("abc","Student","John") val student = newMember.toStudent // 现在可以正常调用了
另外补充一下你原来写的隐式转换函数的正确用法:如果不需要显式调用方法,而是希望编译器自动完成类型转换,可以保留原来的写法,在需要Student类型的地方直接用Member实例即可:
object Member { implicit def toStudent(member: Member): Student = Student(member.name, None, member.id) } // 使用示例:编译器自动转换 val newMember = Member("abc","Student","John") val student: Student = newMember // 这里会自动调用toStudent完成转换
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

