首页 > 解决方案 > 使用元组创建案例类的通用函数无法编译

问题描述

我将用示例解释我的问题,如下所示。

import scala.reflect.ClassTag

trait LivingBeing extends Product { def name:String; def age:Int}
case class Person (name:String, age:Int) extends LivingBeing
case class Cat(name: String, age:Int) extends LivingBeing

// usual way of creating a case class instance
val john = Person("john", 23)

// Creating a case class instance with tuples
val garfield = Cat tupled ("Garfield", 8)

// create a generic function
def createLivingBeing[T<: LivingBeing](name:String, age:Int)(implicit evidence: ClassTag[T]): T = {
  T tupled (name, age) // Does not compile; why?
}

给定其字段的类型和值,如何一般地优雅地构造不同的案例类(具有某种特征)?

标签: scalagenerics

解决方案


Consider type class solution

trait LivingBeingFactory[T <: LivingBeing] {
  def apply(name: String, age: Int): T
}

object LivingBeingFactory {
  implicit val personFactory: LivingBeingFactory[Person] =
    (name: String, age: Int) => Person(name, age)

  implicit val catFactory: LivingBeingFactory[Cat] =
    (name: String, age: Int) => Cat(name, age)
}

def createLivingBeing[T <: LivingBeing](name:String, age:Int)(implicit evidence: LivingBeingFactory[T]): T = {
  evidence(name, age)
}

createLivingBeing[Person]("Picard", 70)
// res0: Person = Person(Picard,70)

createLivingBeing[Cat]("Bob", 5)
// res1: Cat = Cat(Bob,5)

推荐阅读