sealed trait Parent
case class Boy(info: String) extends Parent
case class Girl(info: String) extends Parent
於是,我寫了下面f
功能。給定一個result
和期望的結果類型,它打印出的支票是否成功:
import scala.reflect.runtime.universe._
scala> def f[A:TypeTag, B:TypeTag](result: A): Unit = typeOf[A] match {
| case t if t =:= typeOf[B] => println("good")
| case _ => println("bad")
| }
f: [A, B](result: A)(implicit evidence$1: reflect.runtime.universe.TypeTag[A], implicit evidence$2: reflect.runtime.universe.TypeTag[B])Unit
然後,我跑了它:
scala> f[Boy, Girl](Boy("foo"))
bad
scala> f[Boy, Boy](Boy("foo"))
good
對於我的測試目的(無視println
語句的使用以表示成功),我的使用是否正確?另外,在f
中是否存在運行時異常的風險?如果是這樣,怎麼樣?
'不需要結果的實際情況,因爲你手動comparing'在這種情況下的話,我想簡單地調用'type'方法?例子:'case class F(x:Int)| val y = F(5)| TYPEOF [y.type]'? –
如果你想要一個實例的類型,你需要一個'TypeTag',但問題是你需要兩個類型參數:一個是你想推斷的,另一個是你提供的,但是Scala沒有辦法提供一個並推斷另一個。 –
@ m-z其實,有一種方法可以實現這個結果。 (另外,我會澄清,你的第一句話適用於這個特定的情況,而不是一般情況。) –