参考以下教程https://twitter.github.io/scala_school/type-basics.html,foo[A,B]
将无法编译,因为它过于通用'。我不明白什么太普通'暗示。为什么foo
无法编译,foo1
呢?
scala> def foo[A,B](f: A=>List[A], b:B) = f(b)
<console>:11: error: type mismatch;
found : b.type (with underlying type B)
required: A
def foo[A,B](f: A=>List[A], b:B) = f(b)
^
scala> def foo1[A](f: A=>List[A], b:A) = f(b)
foo1: [A](f: A => List[A], b: A)List[A]
答案 0 :(得分:2)
f
的类型为A => List[A]
。这意味着只能使用f
类型的参数调用A
。因此b
A
的{{1}}类型必须为f(b)
。在b: B
允许b
为任何类型的意义上,A
过于通用,而不仅仅是def wrapInt(i: Int): List[Int] = List(i)
。
例如考虑以下函数:
wrapInt(42)
现在以下呼叫是合法的:
wrapInt("hello")
但这个不是
"hello"
因为Int
不是foo(wrapInt, 42)
。因此应该允许:
foo(wrapInt, "hello")
,但这不应该:
def foo[A,B](f: A=>List[A], b:B)
根据签名wrapInt("hello")
,两者都将被允许,即使后者会导致rdd.unpersist()
,这是错误的类型。因此,该签名对该机构来说是非法的。