以下代码片段来自twitter的Scala学校:
Scala具有一级多态性.粗略地说,这意味着您希望在Scala中表达一些类型概念,这些概念对于编译器而言"过于通用".假设你有一些功能:
Run Code Online (Sandbox Code Playgroud)def toList[A](a: A) = List(a)您希望一般使用:
Run Code Online (Sandbox Code Playgroud)def foo[A, B](f: A => List[A], b: B) = f(b)这不会编译,因为必须在调用站点修复所有类型变量.即使你"钉"式
B,Run Code Online (Sandbox Code Playgroud)def foo[A](f: A => List[A], i: Int) = f(i) // Line 1...你得到一个类型不匹配.
为什么Line 1会失败?B的类型是已知的.为什么编译失败?
scala> def toList[A](a:A) = List(a)
toList: [A](a: A)List[A]
scala> def foo[A, B](f: A => List[A], b: B) = f(b)
<console>:10: error: type mismatch;
found : b.type (with underlying type B)
required: A
def foo[A, B](f: A => List[A], b: B) = f(b)
Run Code Online (Sandbox Code Playgroud)
此行不会编译,因为B当函数需要type值时,您传递的是type 值A.
def foo[A](f: A => List[A], i: Int) = f(i) // Line 1
Run Code Online (Sandbox Code Playgroud)
对于此行,您需要提供从类型Int到类型的隐式转换A.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |