2013-03-10 55 views
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」定義的東西)符合一些常見的類型?它isn't scala.Singleton,但所有類型的Foo.type,Bar.type等應該表達一些共同的特徵似乎是自然的。這樣的事情存在嗎?

在完成了爲Foo.type找到TypeTag的工作之後,是否有一些使用Scala反射來探索Foo.type的超類型和特徵的方法?顯然,這樣的事情不可能是詳盡無遺的,例如,可能會出現潛在的鴨子類型的組合式爆炸,但似乎很奇怪,不能通過反射來攀登已聲明或內置的繼承層次。

謝謝!

回答

3

還有的單身人士之間沒有共同點,但它們不一定是從AnyRef直系後代,由於object可以擴展classtrait