Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-用参数实例化泛型类型?_Scala_Generics - Fatal编程技术网

Scala-用参数实例化泛型类型?

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

据我所知,如果类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) 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
此实现的缺点是它在运行时计算类型,这就是拥有类型参数的全部意义;)如果您知道编译类型的类型,则不需要它。