【问题标题】:How to use structural types in isInstanceOf calls?如何在 isInstanceOf 调用中使用结构类型?
【发布时间】:2011-01-30 18:46:42
【问题描述】:

标题基本上就是这样。

有没有办法使用 e 的类型。 G。 new Object {def foo = "bar"}isInstanceOf[<structural_type_here>] 通话中?

【问题讨论】:

标签: reflection scala types instanceof structural-typing


【解决方案1】:

结构类型不适用于isInstanceOf。同样,结构类型的模式匹配是没有意义的(它们总是匹配的)。

这通常归咎于类型擦除,但即使没有擦除它也不起作用,因为 JVM 不理解结构类型。

另一方面,Scala 可能足够聪明,可以通过擦除来进行结构类型检查。

【讨论】:

  • 这给人一种错误的印象,即根本不涉及擦除...结构类型被擦除为Object(加上一点反射),而isInstanceOf工作的正是这种运行时类型和。这是因为isInstanceOf 与擦除类型一起工作,它总是会返回 true,但你说得对,反射 also 在运行时运行,Scala 理论上能够处理这样的表达式表现如预期。
【解决方案2】:

我想说你可以使用类型别名:

type HasFooMethod = { def foo: String }
val v = new Object {def foo = "bar"}
v.isInstanceOf[HasFooMethod]

但由于擦除,这将始终返回 true。

因此,您可以使用反射,或者只是尝试将对象传递给以结构类型作为参数的方法 - 如果它无效,编译器会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多