2017-08-01 112 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