2017-08-01 126 views
1

根据我的理解,如果A类和B类没有任何参数,那么ClassTag可以在这里使用,但由于他们确实有参数,不知道我怎么能避免在这里创建2个方法,一个用于SimpleA,另一个用于SimpleB身体..Scala - 使用参数实例化泛型?

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) 

试图实例化T给出了错误class type required but T found。不知道这些类型的问题通常如何解决。

+0

我想'''高清fromTupleToSimple(SF:(UUID,字符串)):Simple'''应该足够 –

+0

只是好奇,这是什么用例呢?我的意思是,如果没有其他参数(要选择实例化哪个类),为什么你会有两个类? –

+0

@ insan-e那么,有些方法只能接收SimpleA和其他SimpleB,它们表示diff实体。 – Sofia

回答

2

好了,你仍然可以你ClassTag,它只是变得有点棘手:

def fromTupleToSimple[T <: Simple : ClassTag](sf: (UUID, String)) = classTag 
    .runtimeClass 
    .getConstructors 
    .head 
    .newInstance(sf._1, sf._2) 
    .asInstanceOf[T] 
+0

该实现的缺点是它在运行时评估类型 –

+1

这就是具有类型参数的全部要点;) 如果您知道编译类型的类型,则不会需要它。 – Dima