2014-02-07 24 views
6

我偶然發現​​3210應用於類型轉換時令人費解的行爲。 考慮:結構類型細化和類型相等

import reflect.runtime.universe._ 
type T1 = AnyRef { 
    def apply(name: String): Unit 
    def foo: String 
} 

type Base = { def apply(name: String): Unit } 
type T2 = Base { 
    def foo: String 
} 

鑑於Base是一種細化的別名,我會預計,通過將會員foo將 進一步完善它產生我彷彿就在Base定義foo同一類型。

換句話說,我認爲T1T2表示完全等效的類型。

大多數情況下,scalac似乎同意。 例如我可以通過其中T1一個實例,預計T2一個實例:

def f(x: T1){} 
f(null: T2) // scalac does not complain here 

反之:

def g(x: T2){} 
g(null: T1) // scalac is still happy 

我也可以要求一個證據T1 =:= T2並將其編譯太細:

implicitly[T1 =:= T2] 

但是,使用scala反射I ge牛逼完全不同的結果:

scala> typeOf[T1] =:= typeOf[T2] 
res2: Boolean = false 

所以這是一個階反射的bug(我猜),又或者是有一個根本的原因(技術的其他方面)爲什麼typeOf[T1] =:= typeOf[T2]將返回false?

+0

'TYPEOF [T1] <

+0

這是一個很好的觀察。那麼至少有一些*一致性。另一件好事是它至少爲我提供了一個解決方法:我可以測試'(typeOf [T1] <:

回答

4

可悲的是,它看起來是這個錯誤:https://issues.scala-lang.org/browse/SI-8177

在加方...它看起來像有工作積極進行解決它:)

+0

+1指向我相關的錯誤(S)。但我不確定這是我遇到的錯誤。 SI-8177是關於類型前綴的依賴類型和無效處理。我認爲這會影響我的上面的代碼片段的唯一方法是因爲我的類型別名具有不同的前綴。 REPL確實是這種情況,但我嘗試將所有定義包裝在同一個對象中(=>相同的前綴),並且仍然出現相同的錯誤。雖然修復SI-8177可能會解決我的問題,但這是可能的副作用。我會在2.11.0-RC1出來時試用,如果修復,我會驗證你的答案。 –

+0

好吧,斯卡拉2.11.0-RC1剛剛發佈,所以我試圖反對它(看到SI-8177被標記爲scala 2.11.0-RC1中的固定)。該錯誤仍然存​​在,所以我懷疑SI-8177沒有涵蓋我描述的問題。也許是時候打開一張票了。 –