【问题标题】:InstanceOf some type from runtime, Scala来自运行时的某种类型的实例,Scala
【发布时间】:2013-12-01 11:00:21
【问题描述】:

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

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],情况会更加困难。

【问题讨论】:

    标签: scala reflection types runtime


    【解决方案1】:

    您可以使用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
    

    不过,我想我不必告诉你这是个多么糟糕的主意。

    【讨论】:

    • 感谢回复!没错,这不是一个好主意。但我的想法是,我 100% 确定该对象属于该类型。 Mb 我的问题有一个错误,但我的意思是.asInstanceOf(tm) 所以要进行某种类型转换.. 例如tmru.Type = String,而函数myAsInstanceOf(tm) 实际上与@987654328 相同@
    • 哦,我当时误会了——我把InstanceOf读作isInstanceOf的意思。我认为你需要一个类型标签(或宏)来进行演员表——我会在有机会时尝试组合一个答案。
    • 谢谢!那太好了......如果可能的话,我会尽量避免这种情况,并在此处发布。
    【解决方案2】:

    您只需要在变量之后使用变量的类型属性。 作为一个例子,你可以写:

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

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

    println(stringB)

    【讨论】:

    • 但他试图转换为 Type 值(或 TypeTag 值)表示的类型,而不是 of的类型> 一些给定的值。
    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多