偶尔,我发现案例类的一个有趣的特性。 foo 需要一个函数,其中 3 Int 到一个案例类,代码如下所示:
case class Whatever(a: Int, b: Int, c: Int)
def foo(f: (Int, Int, Int) => Whatever) = f(1,2,3).c
foo(Whatever) //compilation fine, scala complier is powerful ...........
如果Whatever是普通类,显然编译会失败。
谁能解释一下为什么可以这样使用案例类,我怀疑这是工厂应用方法的原因,但我不确定。另外,如果是普通类,是否可以这样作为案例类使用。
最佳答案
Scala 编译器为案例类生成伴生对象并实现一些东西(实现 AbstractFunction3、应用、取消应用):
javap Whatever\$.class
Compiled from "Test.scala"
public final class Whatever$ extends scala.runtime.AbstractFunction3<java.lang.Object, java.lang.Object, java.lang.Object, Whatever> implements scala.Serializable {
public static final Whatever$ MODULE$;
public static {};
public final java.lang.String toString();
public Whatever apply(int, int, int);
public scala.Option<scala.Tuple3<java.lang.Object, java.lang.Object, java.lang.Object>> unapply(Whatever);
public java.lang.Object apply(java.lang.Object, java.lang.Object, java.lang.Object);
}
关于function - 为什么案例类可以用作参数中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419812/