如何获取一个 case class 的 apply 方法

3

给定一个案例类,我想要检索apply方法。

我可以使用A.apply _,但有没有一种只使用A来检索它的方法?

示例:

scala> case class A(s: String)
defined class A

scala> def f[B, C](h: B => C) = h
f: [B, C](h: B => C)B => C

scala> f(A.apply _)
res0: String => A = <function1>

是否有可能只写 f(A) 或类似的内容呢?

2个回答

3
以下内容适用于Scala 2.11:
package sandbox

object ApplyMethod {
  import sandbox.OtherApplyTest.C
  case class A(s: String)

  object B {
    def apply(s: String): A = A(s)
  }

  def D(s: String) = OtherApplyTest.D(s)

  def f[T](h: String => T) = h("hello")

  def g[T, U](h: T => U) = h

  def main(args: Array[String]) {
    println(f(A)) // prints A(hello)
    // println(f(B)) doesn't compile
    println(f(C)) // prints C(hello)
    println(f(D)) // prints D(hello)
    println(g(A)) // prints A
    println(g(C)) // prints C
    println(g(D)) // prints <function1>
    println(f(g(A))) // prints A(hello)
  }
}

object OtherApplyTest {

  case class C(s: String)

  case class D(s: String)
}

看起来你想做的事情(以及你如何做到这一点)可能是在 REPL 或较旧版本的 Scala 中不起作用。


2

我从未遇到过Scala将A(...)A.apply(...)区别对待的情况。在我的解释器中,f(A)可以正常工作:

scala> case class A(s: String)
defined class A

scala> def f[B, C](h: B => C) = h
f: [B, C](h: B => C)B => C

scala> f(A)
res1: String => A = A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接