Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定Scala中对象的类?_Scala_Subclass_Instanceof_Subtyping - Fatal编程技术网

如何确定Scala中对象的类?

如何确定Scala中对象的类?,scala,subclass,instanceof,subtyping,Scala,Subclass,Instanceof,Subtyping,我需要检查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 i

我需要检查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)

如果只创建新实例,
getClass
就可以了。但您正在创建新的匿名类及其实例


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

你问题的标题是class,但实际问题使用traits。您可以通过类的运行时反射来执行类似的操作。让我们创建一个方便的方法来获取对象的
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
方法获得
x
y
Type
,并将其与使用
typeOf
获得的
TypeTag
Type
进行比较。这将产生您想要的结果

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
但这不适用于traits,因为在您的示例中,
y
不是
bar
的实例,它是扩展
bar
的匿名类的实例。因此,使用此方法总是会产生
false

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`

如果您需要这样做,这是否意味着
bar
不应该扩展
foo
?你想要达到什么样的整体效果?@DNA在我的例子中foo,bar,x和y已经被定义了,所以我希望我能在这个特征层次中识别类型差异,但似乎不是这样。有
,但OP希望
tpeOf(y)=:=typeOf[foo]
,就是这样<代码>