Scala中泛型类型的函数成员的参数类型的推断?

时间:2013-10-03 20:18:03

标签: scala

(真的很糟糕。)

无论如何:我可以以某种方式让Scala推断出第二行b的类型吗?

scala> class A[B](val b: B, val fun: B => Unit)
defined class A

scala> new A("123", b => { })
<console>:9: error: missing parameter type
              new A("123", b => { })
                           ^

添加类型后,这可以正常工作:

scala> new A("123", (b: String) => { })
res0: A[String] = A@478f6f48

String肯定是预期的类型:

scala> new A("123", (b: Int) => {})
<console>:9: error: type mismatch;
 found   : Int => Unit
 required: String => Unit
              new A("123", (b: Int) => {})
                                    ^

1 个答案:

答案 0 :(得分:4)

对于Scala中的此类情况,与许多其他语言一样,存在currying的概念:

scala> class A[B](val b: B)(val fun: B => Unit)
defined class A

scala> new A("string")(_.toUpperCase)
res8: A[String] = A@5884888a

您还可以使用案例类简化此操作:

scala> case class A[B](b: B)(fun: B => Unit)
defined class A

scala> A("string")(_.toUpperCase)
res9: A[String] = A(string)

至于你的例子:

new A("123", (b: Int) => {})

你不能这样做,类声明中的两个参数都有通用B类型,因此两个参数必须具有相同的类型