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实际上,有一种方法可以实现这一结果。(另外,我要澄清的是,你的第一句话适用于这个具体案例,而不是一般情况。)