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其实,有一种方法可以实现这个结果。 (另外,我会澄清,你的第一句话适用于这个特定的情况,而不是一般情况。) –