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. UVC功能配置界面
- 4. 用户界面选择是功能性还是非功能性需求?
- 5. 功能Scala的
- 6. WPF动画/用户界面功能性能和基准测试
- 7. <Scala的功能性编程> simulateMachine
- 8. Delphi界面性能问题
- 9. 基于功能性编程的用户界面
- 10. jQuery的用户界面功能问题
- 11. Scala的可堆叠性状
- 12. 办公功能界面和谷歌Chrome界面
- 13. 用户界面功能建模语言?
- 14. jQuery Slider用户界面 - 增强功能
- 15. Kotlin:使用lambda代替功能界面?
- 16. Scala中从母体性状
- 17. 功能VS Scala的方法
- 18. 用户界面性能监控工具
- 19. Scala:从java界面重写方法
- 20. scala中的理解性能
- 21. 序列样功能Scala中
- 22. Scala和星火UDF功能
- 23. Scala和使用的Mockito性状
- 24. Scala的性状密新订购
- 25. Scala中使用的Val性状
- 26. Scala的功能与面向对象的融合
- 27. 只读出的界面,读取里面执行/写性能
- 28. 什么是Scala的部分应用功能的真实世界示例
- 29. 智能逻辑查询的性能里面的功能PostgreSQL的
- 30. 您使用的CMS的最佳界面功能是什么?
,然后你的意思是@dcastro协变 – dcastro
感谢。答案已更新。其中一天,我会得到协变与直接逆变。 –
哈哈我知道,对吧?下面是如何存储它:*共*变体是当这两种类型的在同一方向上变化:'A:> B'因此'X [A]:> X [B]'。 * *魂斗罗变体是当它们在相反的方向上有所不同:'A:> B'因此'X [B]:> X [A]'(注:在拉丁美洲和一些拉丁衍生语言,[ “反向” 是指“对“(http://en.wikipedia.org/wiki/Contra)) – dcastro