gpt4 book ai didi

scala - 理解 Scala 中的案例类和特征

转载 作者:行者123 更新时间:2023-12-04 01:30:34 25 4
gpt4 key购买 nike

我有一个简单的特征,定义如下:

trait MyTrait {

def myStringVal: String

}

我实现此特征的案例类如下:
case class MyCaseClass(myStringVal: String) extends MyTrait {
...
...
}

来自 Java 世界,我发现 MyCaseClass 实际上仅通过为 MyCaseClass 定义一个参数来实现这一点有点困难。我知道你的字节码实际上会写 getter 和 setter。但是,如果没有任何 var 或 val,这怎么可能呢?

我的理解是,如果没有 var 或 val,则不会生成 getter 或 setter 方法。在那种情况下,上面的案例类 MyCaseClass 是如何实现 myStringVal 方法的?

有时,太多的 Scala 魔法难以理解,尤其是遗留代码。

最佳答案

您可能想查看 this blog article涵盖究竟是什么案例类以及为什么它们如此有用。

在您的示例中,特征 MyTrait没有用,除了能够像java接口(interface)一样运行。请注意,scala 中的默认可见性是公开的。默认情况下,案例类参数是不可变的,因此在您的示例中 val由编译器自动推断为 myStringVal争论。

案例课有什么魔力?!

  • 默认字段
  • 将所有构造函数参数转换为公共(public)只读 ( val)
  • 生成toString() , equals()hashcode()使用每个方法的所有构造函数参数的方法
  • 生成具有相同名称的伴随对象,其中包含适当的 apply()unapply()方法,它基本上只是一个方便的构造函数,允许在不使用 new 的情况下进行实例化关键字和一个提取器,默认情况下会生成一个选项包装的 tuple案例类参数。

  • 编辑: (案例)类的示例编译器输出(从 scalatutorial.de 复制)

    一个简单的 scala 类定义,例如
    class A1(v1: Int, v2: Double)

    被编译成java代码
    public class A1 extends java.lang.Object implements scala.ScalaObject {
    public A1(int, double);
    }

    类比案例类
    case class A2(v1: Int, v2: Double)

    被编译为以下 java 类
    public class A2 extends java.lang.Object implements 
    scala.ScalaObject,scala.Product,java.io.Serializable {
    public static final scala.Function1 tupled();
    public static final scala.Function1 curry();
    public static final scala.Function1 curried();
    public scala.collection.Iterator productIterator();
    public scala.collection.Iterator productElements();
    public double copy$default$2();
    public int copy$default$1();
    public int v1();
    public double v2();
    public A2 copy(int, double);
    public int hashCode();
    public java.lang.String toString();
    public boolean equals(java.lang.Object);
    public java.lang.String productPrefix();
    public int productArity();
    public java.lang.Object productElement(int);
    public boolean canEqual(java.lang.Object);
    public A2(int, double);
    }


    public final class A2$ extends scala.runtime.AbstractFunction2
    implements scala.ScalaObject {
    public static final A2$ MODULE$;
    public static {};
    public scala.Option unapply(A2);
    public A2 apply(int, double);
    public java.lang.Object apply(java.lang.Object, java.lang.Object);
    }

    关于scala - 理解 Scala 中的案例类和特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22769175/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com