Scala 使用TypeTags检查预期类型是否与实际类型匹配
鉴于: 然后,我编写了以下Scala 使用TypeTags检查预期类型是否与实际类型匹配,scala,Scala,鉴于: 然后,我编写了以下f函数。给定结果和预期结果类型,它将打印检查是否成功: sealed trait Parent case class Boy(info: String) extends Parent case class Girl(info: String) extends Parent 然后,我运行它: import scala.reflect.runtime.universe._ scala> def f[A:TypeTag, B:TypeTag](result: A):
f
函数。给定结果
和预期结果类型,它将打印检查是否成功:
sealed trait Parent
case class Boy(info: String) extends Parent
case class Girl(info: String) extends Parent
然后,我运行它:
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
出于测试目的(忽略使用println
语句表示成功),我使用TypeTag
是否正确?另外,f
中是否存在运行时异常的风险?如果是,怎么做
我对TypeTag的使用正确吗
如果手动提供类型参数,则实际上不需要使用TypeTag
。这大致相当于:
scala> f[Boy, Girl](Boy("foo"))
bad
scala> f[Boy, Boy](Boy("foo"))
good
f[Girl](boy)
如果boy
是一个boy
,则甚至不会编译,因此失败案例不会有用
对于def[A:TypeTag,B:TypeTag](结果:A):Unit
,不需要result
的实际实例,因为要手动比较A
和B
的TypeTag
,需要手动指定类型参数。这相当于在没有实例的情况下说typeOf[A]=:=typeOf[B]
另外,f
中是否存在运行时异常的风险
不是真的。你必须做一些真正邪恶的事情,比如做你自己的TypeTag
s:
def f[A](result: A): Unit = ???
只要使用编译器生成的TypeTag
,就可以了
我对TypeTag的使用正确吗
如果手动提供类型参数,则实际上不需要使用TypeTag
。这大致相当于:
scala> f[Boy, Girl](Boy("foo"))
bad
scala> f[Boy, Boy](Boy("foo"))
good
f[Girl](boy)
如果boy
是一个boy
,则甚至不会编译,因此失败案例不会有用
对于def[A:TypeTag,B:TypeTag](结果:A):Unit
,不需要result
的实际实例,因为要手动比较A
和B
的TypeTag
,需要手动指定类型参数。这相当于在没有实例的情况下说typeOf[A]=:=typeOf[B]
另外,f
中是否存在运行时异常的风险
不是真的。你必须做一些真正邪恶的事情,比如做你自己的TypeTag
s:
def f[A](result: A): Unit = ???
只要使用编译器生成的
TypeTag
,就可以了。以下是提供一个参数并推断另一个参数的方法:
scala> implicit val tt: TypeTag[Boy] = null.asInstanceOf[TypeTag[Boy]]
tt: reflect.runtime.universe.TypeTag[Boy] = null
scala> f[Boy, Girl](Boy("foo"))
java.lang.NullPointerException
以下是如何提供一个参数并推断另一个参数:
scala> implicit val tt: TypeTag[Boy] = null.asInstanceOf[TypeTag[Boy]]
tt: reflect.runtime.universe.TypeTag[Boy] = null
scala> f[Boy, Girl](Boy("foo"))
java.lang.NullPointerException
不需要结果的实际实例,因为您正在手动比较
,在这种情况下,我只需调用类型
方法?示例:case类F(x:Int)| val y=F(5)| typeOf[y.type]
?如果您想要实例的类型,您需要一个TypeTag
,但问题是您需要两个类型参数:一个是您想要推断的,另一个是您想要提供的,但Scala没有提供一个和推断另一个的方法。@m-z实际上,有一种方法可以实现这一结果。(另外,我要澄清的是,您的第一句话适用于此特定情况,而不是一般情况。)不需要结果的实际实例,因为您正在手动比较
,在这种情况下,我只需调用类型
方法?示例:case类F(x:Int)| val y=F(5)| typeOf[y.type]
?如果您想要实例的类型,您需要一个TypeTag
,但问题是您需要两个类型参数:一个是您想要推断的,另一个是您想要提供的,但Scala没有提供一个和推断另一个的方法。@m-z实际上,有一种方法可以实现这一结果。(另外,我要澄清的是,你的第一句话适用于这个具体案例,而不是一般情况。)