2017-06-28 74 views
0

我有一個通用類型爲T的函數readObjectFromFile。我怎樣才能知道類型名稱?在Scala中獲得一個通用類型的類名稱

import scala.reflect.runtime.universe.{typeOf, TypeTag} 

def name[T: TypeTag] = typeOf[T].typeSymbol.name.toString 

name[Int] 
res5: String = Int 

import java.io._ 

def readObjectFromFile[T](file: File): T = { 
    val typeName = name[T] 
    println(s"read ${typeName} from file $file") 
    val ois = new ObjectInputStream(new FileInputStream(file)) 
    val v = ois.readObject.asInstanceOf[T] 
    ois.close() 
    v 
} 

cmd19.sc:2: No TypeTag available for T 
    val typeName = name[T] 

PS:我知道我可以使用v.getClass.getName,但這後進行閱讀的對象。我想在閱讀對象之前打印這些信息。

+0

您通常希望將'ois.readObject'包裝在'try'中,並將'close'放在'finally'中,這樣您就不會在文件失敗時保持關閉狀態。 –

+0

或甚至更好地使用scala中的資源分配;這不是生產代碼;它只是一個最小,完整和可驗證的示例:https://stackoverflow.com/help/mcve –

回答

1

readObjectFromFile也需要隱含TypeTag以便name能夠解決它。

import scala.reflect.runtime.universe.{typeOf, TypeTag} 
import java.io._ 

def name[T: TypeTag] = typeOf[T].typeSymbol.name.toString 

def readObjectFromFile[T: TypeTag](file: File): T = { 
    val typeName = name[T] 
    println(s"read ${typeName} from file $file") 
    val ois = new ObjectInputStream(new FileInputStream(file)) 
    val v = ois.readObject.asInstanceOf[T] 
    ois.close() 
    v 
} 
相關問題