(真的很糟糕。)
无论如何:我可以以某种方式让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) => {})
^
答案 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
类型,因此两个参数必须具有相同的类型