如何在isInstanceOf调用中使用结构类型?

时间:2011-01-30 18:46:42

标签: reflection scala types instanceof structural-typing

标题基本上是这样说的。

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

2 个答案:

答案 0 :(得分:3)

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

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

但是,由于擦除,这将永远归于真实。

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

答案 1 :(得分:3)

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

这通常归咎于类型擦除,但即使没有擦除也无法工作,因为JVM不了解结构类型。

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