【发布时间】:2018-01-18 12:04:05
【问题描述】:
我有一个简单的类和一个带有重载应用方法的伴生对象:
case class A(val s: String,
val x: Int,
val y: Int,
val z: Int,
val foo: Int => Int,
val l: Option[List[String]])
object A {
def apply(s: String, x: Int, y: Int, z: Int, foo: Int => Int) =
new A(s, x, y, z, foo, None)
def apply(s: String, x: Int, y: Int, z: Int, foo: Int => Int, l: List[String]) =
new A(s, x, y, z, foo, Some(l))
}
让我们也定义一个函数:
def foo(x: Int): Int = x + 1
使用第一个构造函数有效:
scala> val a1 = A("a1", 1, 2, 3, foo)
a1: A = A(a1,1,2,3,$$Lambda$1842/2112068307@598e02f0,None)
但是使用第二个不会:
val a2 = A("a1", 1, 2, 3, foo, List("b1", "b2"))
<console>:24: error: missing argument list for method foo
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `foo _` or `foo(_)` instead of `foo`.
val a2 = A("a1", 1, 2, 3, foo, List("b1", "b2"))
问题:我需要传递 foo _ 或 foo(_) 而不是像 a1 示例中的 foo 的原因是什么?另外,我可以重新定义我的班级以使其可以只使用foo吗?
【问题讨论】:
-
第二个
apply的正文中的Some(l)部分包起来。 -
对不起,我错过了,当我意识到时删除了我的旧评论
-
@toni057 我设法挖出了一个描述相同问题的问题:stackoverflow.com/questions/17324247/…(你只有
applys 而不是rs)
标签: scala