我剛剛開始嘗試使用Scala 2.10中引入的反射API,並期望下面的代碼評估爲真五次(REPL)。使用TypeTags和單例類型的Scala反射
不幸的是,只有第一個和最後一個表達式確實有效。有人可以解釋爲什麼會出現這種情況嗎?從編譯器的角度來看,所有這些類型的比較都可以,或者我錯了?
有沒有辦法讓這個(至少有一個.type
比較)的工作?
import scala.reflect.runtime.universe._
class Test[A:TypeTag](val a:A) {
val value:this.type=this
def t1:TypeTag[Test[A]]=typeTag[Test[A]]
def t2:TypeTag[this.type]=typeTag[this.type]
def t3:TypeTag[_<:Test[A]]=typeTag[this.type]
}
val a:Test[String]=new Test("a")
a.t1.tpe<:<typeOf[Test[String]] //works as expected
a.t2.tpe<:<typeOf[Test[String]] //FAILS
a.t3.tpe<:<typeOf[Test[String]] //FAILS
a.t2.tpe<:<typeOf[a.type] //FAILS
typeOf[a.type]<:<typeOf[a.type] //this works again
使用Scala REPL 2.10.3和2.11.0-M7進行測試。
問候,
梅西
但是,你的例子也是「靜態失敗」(val a:c2.type = c1)的區別嗎? 不幸的是,您的解決方案並非我所尋找的,因爲這正是我想要避免的:必須從外部傳遞類型信息。目標是一種「內在化」的類,即它帶有它自己的類型信息)。 – messi
@messi是的,抱歉,我沒有聽清你問題中的所有問題。但我認爲事實仍然是一個對象不能攜帶_singleton_類型的信息,因爲它取決於使用該對象的上下文。 – ghik