scala - 使用元组创建案例类的通用函数无法编译
问题描述
我将用示例解释我的问题,如下所示。
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?
}
给定其字段的类型和值,如何一般地优雅地构造不同的案例类(具有某种特征)?
解决方案
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)
推荐阅读
- wordpress - 在购物车页面中显示包含和不包含增值税的总价和小计价
- opencv - Opencv视频播放问题
- javascript - 当状态是对象数组时更新状态
- sql - 如何加入列名
- json - JSON 和 CBOR 格式可以互换吗?
- intune - 是否可以在 Microsoft Intune(端点管理器)中添加虚拟设备?
- java - if else 条件未正确执行
- python - 我想返回 y 的最后一个值和附加列表。但是,该列表没有被返回。它指出:名称'y'未定义
- biopython - 我能做些什么来添加这个计数,并制作正确的数据框?
- ios - XCode 13.1:未定义符号:__swift_FORCE_LOAD__XCTestSwiftSupport