Scala代碼:爲什麼`特質T; C類;類X擴展(C與T)`不能被編譯?
trait T
class C
type W = C with T
class X extends W
W
是一個類型別名,但我希望定義一個類來擴展它。爲什麼以及如何解決它?
Scala代碼:爲什麼`特質T; C類;類X擴展(C與T)`不能被編譯?
trait T
class C
type W = C with T
class X extends W
W
是一個類型別名,但我希望定義一個類來擴展它。爲什麼以及如何解決它?
我很難構建我的答案在一個不錯的方式,但這裏仍然是解釋的嘗試是怎麼回事:
你得到一個編譯錯誤,因爲extends
條款要求類和特質,不是類型,你'給一個類型。類和特徵不能與類型混淆。
當然有更好的解釋。但基本上,一個類型指定了可以應用於某些事物(有時是其他屬性)的操作。類和特徵定義其實例的行爲。
在大多數靜態類型的OO語言中,每個類/接口/特性也有一個關聯的類型。然而,相互關係通常不是真實的:並非所有類型都具有相應的類/界面/特徵。例如,您的C with T
是一種類型,但不是類,也不是特性(甚至不是它們的組合)。
extends
子句期望類和特徵(由with
分隔),但不是一種類型。這是因爲extends
的意思是:延伸行爲這個東西。正如我所說的,類型不定義行爲。
在大多數地方,語法A with B
表示類型這既是類型A
和類型B
的子類型。然而,在extends
子句中,with
具有不同的含義,並且僅作爲extends
參數的分隔符(很像,
充當方法調用參數的分隔符)。
如果你寫class X extends C with T
,它會工作,因爲它意味着class X extends C, T
,如果你想。
HTH
字符串是最後一個類,不能擴展。
雖然這是正確的,問題是不支持這種類型的擴展名,即使不是字符串你使用一些自定義的類,它仍然不會編譯。 – 2014-09-21 14:21:26
對,我將其更改爲自定義類,編譯錯誤相同 – Freewind 2014-09-21 14:25:37
「由於擴展子句需要類和特性,因此不需要類型」,您可以刪除其餘部分:) – samthebest 2014-09-21 17:33:55