4

我需要检查y是否严格地是bar而不是foo的实例。我怎样才能在 Scala 中做到这一点?

trait foo {}

trait bar extends foo {}

val x = new foo {}
val y = new bar {}

x.isInstanceOf[foo] // true
x.isInstanceOf[bar] // false

y.isInstanceOf[bar] // true
y.isInstanceOf[foo] // true (but I want it to return false)
4

2 回答 2

3

getClass如果您只是创建新实例,它将起作用。但是您正在创建新的匿名类和它们的实例。

对于那些与 foo 和 bar 的关系是完全相同的:它们是超类。

于 2015-05-03T20:16:10.797 回答
3

您的问题的标题是类,但实际问题使用特征。您可以通过使用classes的运行时反射来做这样的事情。让我们创建一个方便的方法来获取reflect.runtime.universe.Type一个对象:

import scala.reflect.runtime.universe._

def tpeOf[A](a: A)(implicit tt: TypeTag[A]): Type = tt.tpe

还有一些示例类:

class Foo
class Bar extends Foo
val x = new Foo
val y = new Bar

我们可以使用我们的tpeOf方法来获得 的Typex并将y其与Type使用TypeTag获得的 进行比较typeOf。这将产生您想要的结果。

scala> tpeOf(x) =:= typeOf[Foo]
res0: Boolean = true

scala> tpeOf(x) =:= typeOf[Bar]
res1: Boolean = false

scala> tpeOf(y) =:= typeOf[Foo]
res2: Boolean = false

scala> tpeOf(y) =:= typeOf[Bar]
res3: Boolean = true

但这不适用于特征,因为在您的示例y不是的实例,而是扩展bar的匿名类的实例。所以使用这种方法总是会产生. barfalse

trait foo {}
trait bar extends foo {}
val x = new foo {}
val y = new bar {}

scala> tpeOf(x) =:= typeOf[bar]
res4: Boolean = false   // As expected, `x` is not exactly `bar`
于 2015-05-03T22:27:56.563 回答