Scala-用参数实例化泛型类型?
据我所知,如果类A和B没有任何参数,那么这里可以使用Scala-用参数实例化泛型类型?,scala,generics,Scala,Generics,据我所知,如果类A和B没有任何参数,那么这里可以使用ClassTag,但由于它们确实有参数,我不确定如何避免在这里创建两个方法,一个用于SimpleA,另一个用于具有相同主体的SimpleB trait Simple { val id: UUID val name: String } case class SimpleA(id: UUID, name: String) extends Simple case class SimpleB(id: UUID, name: String) ex
ClassTag
,但由于它们确实有参数,我不确定如何避免在这里创建两个方法,一个用于SimpleA,另一个用于具有相同主体的SimpleB
trait Simple {
val id: UUID
val name: String
}
case class SimpleA(id: UUID, name: String) extends Simple
case class SimpleB(id: UUID, name: String) extends Simple
def fromTupleToSimple[T <: Simple](sf: (UUID, String)): T = new T(sf._1, sf._2)
trait-Simple{
valid:UUID
val名称:String
}
case类SimpleA(id:UUID,name:String)扩展了Simple
case类SimpleB(id:UUID,name:String)扩展了Simple
def fromTupleToSimple[T好吧,你仍然可以ClassTag
,它只是变得有点棘手:
def fromTupleToSimple[T <: Simple : ClassTag](sf: (UUID, String)) = classTag
.runtimeClass
.getConstructors
.head
.newInstance(sf._1, sf._2)
.asInstanceOf[T]
def fromTupleToSimple[T我认为def fromTupleToSimple(sf:(UUID,String)):Simple
应该很好奇,它的用例是什么?我的意思是,如果没有其他参数(选择实例化哪个类),为什么你会有两个类?@insan-e嗯,有些方法只能接收SimpleA和其他SimpleB,它们代表不同的实体。@SamD在这种情况下,我真的需要更具体的类型,因为它稍后将通过sangria graphql中的一些宏进行验证。也不能执行new Simple(),因为这是一个特性。(SimpleA.apply).tupled
此实现的缺点是它在运行时计算类型,这就是拥有类型参数的全部意义;)如果您知道编译类型的类型,则不需要它。