3
A
回答
8
在Scala中,由+ R的功能1簽名表示的Function
類型的協變:
trait Function1[-T1, +R] extends AnyRef
這意味着你有什麼是正確的了。具有MyTrait
延伸(Int => MyTrait)
(這是一樣的Function1[Int, MyTrait
)表示延伸MyTrait將具有任何類型來實施apply
函數,返回的MyTrait
任何實例。
下面將根據您當前MyTrait
簽名都是合法的:
class Foo extends MyTrait {
def apply(x: Int): Foo = new Foo
}
class Bar extends MyTrait {
def apply(x: Int): Foo = new Foo
}
class Baz extends MyTrait {
def apply(x: Int): MyTrait = new MyTrait { def apply(y: Int) = new Baz }
}
4
由於丹寫的正常行爲是返回MyTrait的任何實例。
如果你想限制它只能返回你可以這樣做,當前對象的類型的實例:當您實現(從丹複製)
class Foo extends MyTrait[Foo] {
def apply(x: Int): Foo = new Foo
}
class Bar extends MyTrait[Bar] {
def apply(x: Int): Foo = new Foo //Compile error
}
class Baz extends MyTrait[Baz] {
def apply(x: Int): MyTrait = new MyTrait { def apply(y: Int) = new Baz }
}
+3
這就是所謂的‘F-界多態性’ – Daenyth
+2
我真的很喜歡這種模式,並發現它是非常有用的。只是一個小紙條,我想'Baz'類也不能編譯,因爲'apply'必須返回一個'Baz'。 –
相關問題
- 1. F#功能界面
- 2. 無界面功能
- 3. IWizard界面的可能性
- 4. UVC功能配置界面
- 5. 界面與功能記錄
- 6. 用戶界面選擇是功能性還是非功能性需求?
- 7. Scala的 - 在性狀
- 8. 功能Scala的
- 9. WPF動畫/用戶界面功能性能和基準測試
- 10. <Scala的功能性編程> simulateMachine
- 11. Delphi界面性能問題
- 12. 反射性能和界面
- 13. 返回性狀從功能
- 14. 基於功能性編程的用戶界面
- 15. jQuery的用戶界面功能問題
- 16. Scala - >功能
- 17. Scala的可堆疊性狀
- 18. 辦公功能界面和谷歌Chrome界面
- 19. Kotlin:使用lambda代替功能界面?
- 20. 用戶界面功能建模語言?
- 21. jQuery Slider用戶界面 - 增強功能
- 22. Scala中從母體性狀
- 23. 屬性界面
- 24. scala的功能開關
- 25. 功能VS Scala的方法
- 26. IBM Worklight:用戶界面性能
- 27. 用戶界面性能監控工具
- 28. 有沒有辦法將現有的界面變成功能界面?
- 29. 噴霧:在性狀重寫功能
- 30. Scala TypeTags和性能
,然後你的意思是@dcastro協變 – dcastro
感謝。答案已更新。其中一天,我會得到協變與直接逆變。 –
哈哈我知道,對吧?下面是如何存儲它:*共*變體是當這兩種類型的在同一方向上變化:'A:> B'因此'X [A]:> X [B]'。 * *魂鬥羅變體是當它們在相反的方向上有所不同:'A:> B'因此'X [B]:> X [A]'(注:在拉丁美洲和一些拉丁衍生語言,[ 「反向」 是指「對「(http://en.wikipedia.org/wiki/Contra)) – dcastro