2

给定一个在 Scala 中定义的单例对象...

object Foo;

有一个类型,Foo.type,它表示该对象唯一符合的类型。凉爽的!

但我对这种类型还有什么了解。任何事物?我可以看出 Foo.type 是 AnyRef 的子类型。凉爽的!

import scala.reflect.runtime.universe.TypeTag
val fooTypeTypeTag = implicitly[TypeTag[Foo.type]]
val anyRefTypeTag = implicitly[TypeTag[AnyRef]]
fooTypeTypeTag.tpe <:< anyRefTypeTag.tpe            // true
fooTypeTypeTag.tpe =:= anyRefTypeTag.tpe            // false

但是无论如何要知道 Foo.type 是否是 AnyRef 的直接后代?是否存在一些所有单例对象(通过“对象 XXX”定义的事物)都符合的通用类型?它不是 scala.Singleton,但似乎很自然,所有类型 Foo.type、Bar.type 等都应该表达一些共同的特征。这样的事情存在吗?

在完成为 Foo.type 找到 TypeTag 的工作之后,是否有一些方法可以利用 Scala 反射来探索 Foo.type 的超类型和特征?显然这样的事情不可能详尽无遗,例如潜在的鸭子类型的组合爆炸,但不能通过反射爬上已声明或内置的继承层次结构似乎仍然很奇怪。

谢谢!

4

1 回答 1

3

单例之间没有共同特征,但它们不一定是 的直接后代AnyRef,因为 anobject可以扩展 aclasstrait.

于 2013-03-10T03:42:09.467 回答