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、 anは aまたはobjectを拡張できるため、必ずしも の直接の子孫であるとは限りません。classtrait

于 2013-03-10T03:42:09.467 に答える