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