InstanceOf某些类型来自运行时,Scala

时间:2013-11-18 10:20:27

标签: scala reflection types runtime

这个想法是,例如我们得到了一些对象的类型:

val tm = getTypeTag("String here").tpe
//> tm: reflect.runtime.universe.Type = java.lang.String

// for example I got another val or var, of some type:

val tmA: Any = "String here"
//> tmA: Any = String here

如何制作tmA.InstanceOf(tm)(这是一个助记符代码)? '原因tm它不是类型别名,我们无法准确地InstanceOf[tm]

已编辑

我指的是asIstanceOf的模拟函数,用于进行类型转换

EDITED2

我自己会部分回答我的问题。所以如果我们有TypeTags就很容易了!

def tGet[T](t: TypeTag[T], obj: Any): T = obj.asInstanceOf[T]

如果我们只有Type而不是整个TypeTag[T],那将是一个更难的情况。

2 个答案:

答案 0 :(得分:6)

您可以使用mirror来反映实例:

val mirror = runtimeMirror(getClass.getClassLoader)

def isTm(a: Any) = mirror.reflect(a).symbol == tm.typeSymbol

然后:

scala> isTm("String here": Any)
res0: Boolean = true

scala> isTm(List("String here"): Any)
res1: Boolean = false

但我认为我不得不告诉你这是个坏主意。

答案 1 :(得分:-1)

您只需要在变量后使用变量的type属性。 举个例子,你可以写:

val h =“你好” val b:Any =“hhhh”

val stringB:String = b.asInstanceOf [h.type]

的println(stringB)