2015-06-30 60 views
3

下面的代码片段是从Twitter的Scala的学校:斯卡拉秩1多态性

Scala有秩1多态性。粗略地说,这意味着你想在Scala中表达一些类型概念,这对编译器来说太“通用”了。假设你有一些功能:

def toList[A](a: A) = List(a) 

您希望使用一般:

def foo[A, B](f: A => List[A], b: B) = f(b) 

这不能编译,因为所有类型的变量必须固定在调用现场。即使你“敲定” B类型,

def foo[A](f: A => List[A], i: Int) = f(i) // Line 1 

...你会得到一个类型不匹配。

为什么第1行会失败? B的类型是已知的。为什么这个编译失败?

回答

5
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) 

此行不会编译,因为你逝去的B类型的值时,该函数需要A类型的值。

def foo[A](f: A => List[A], i: Int) = f(i) // Line 1 

对于此行,你需要提供从Int类型的隐式转换键入A