Scala的case class究竟默认实现了哪些方法?

首先写一个样例类Demo

package com.ruozedata.bigdata.scala04.casepkg

object CaseClassDemo01 {
  def main(args: Array[String]): Unit = {
    print("CaseClass")
  }
}

abstract class Amount

case class Dollar(value: String) extends Amount

case class Currency(value: Double, unit: String) extends Amount

case object NoAmount extends Amount

运行后,使用反编译打开,会发现一个样例类 Dollar会生成Dollar$.class和Dollar.class文件


image.png

首先来看Dollar$.class

package com.ruozedata.bigdata.scala04.casepkg;

import scala.Option;
import scala.Serializable;
import scala.Some;
import scala.runtime.AbstractFunction1;

public final class Dollar$ extends AbstractFunction1<String, Dollar> implements Serializable {
  public static final Dollar$ MODULE$;
  
  public final String toString() {
    return "Dollar";
  }
  
  public Dollar apply(String value) {
    return new Dollar(value);
  }
  
  public Option<String> unapply(Dollar x$0) {
    return (x$0 == null) ? (Option<String>)scala.None$.MODULE$ : (Option<String>)new Some(x$0.value());
  }
  
  private Object readResolve() {
    return MODULE$;
  }
  
  private Dollar$() {
    MODULE$ = this;
  }
}

然后Dollar.class

package com.ruozedata.bigdata.scala04.casepkg;

import scala.Function1;
import scala.Option;
import scala.Product;
import scala.Serializable;
import scala.collection.Iterator;
import scala.reflect.ScalaSignature;
import scala.runtime.BoxesRunTime;
import scala.runtime.ScalaRunTime$;

@ScalaSignature(bytes = "\006\001\005}a\001B\001\003\0016\021a\001R8mY\006\024(BA\002\005\003\035\031\027m]3qW\036T!!\002\004\002\017M\034\027\r\\11i)\021q\001C\001\bE&<G-\031;b\025\tI!\"A\005sk>TX\rZ1uC*\t1\"A\002d_6\034\001a\005\003\001\035IA\002CA\b\021\033\005\021\021BA\t\003\005\031\tUn\\;oiB\0211CF\007\002))\tQ#A\003tG\006d\027-\003\002\030)\t9\001K]8ek\016$\bCA\n\032\023\tQBC\001\007TKJL\027\r\\5{C\ndW\r\003\005\035\001\tU\r\021\"\001\036\003\0251\030\r\\;f+\005q\002CA\020#\035\t\031\002%\003\002\")\0051\001K]3eK\032L!a\t\023\003\rM#(/\0338h\025\t\tC\003\003\005'\001\tE\t\025!\003\037\003\0311\030\r\\;fA!)\001\006\001C\001S\0051A(\0338jiz\"\"AK\026\021\005=\001\001\"\002\017(\001\004q\002bB\027\001\003\003%\tAL\001\005G>\004\030\020\006\002+_!9A\004\fI\001\002\004q\002bB\031\001#\003%\tAM\001\017G>\004\030\020\n3fM\006,H\016\036\0232+\005\031$F\001\0205W\005)\004C\001\034<\033\0059$B\001\035:\003%)hn\0315fG.,GM\003\002;)\005Q\021M\0348pi\006$\030n\0348\n\005q:$!E;oG\",7m[3e-\006\024\030.\0318dK\"9a\bAA\001\n\003z\024!\0049s_\022,8\r\036)sK\032L\0070F\001A!\t\te)D\001C\025\t\031E)\001\003mC:<'\"A#\002\t)\fg/Y\005\003G\tCq\001\023\001\002\002\023\005\021*\001\007qe>$Wo\031;Be&$\0300F\001K!\t\0312*\003\002M)\t\031\021J\034;\t\0179\003\021\021!C\001\037\006q\001O]8ek\016$X\t\\3nK:$HC\001)T!\t\031\022+\003\002S)\t\031\021I\\=\t\017Qk\025\021!a\001\025\006\031\001\020J\031\t\017Y\003\021\021!C!/\006y\001O]8ek\016$\030\n^3sCR|'/F\001Y!\rIF\fU\007\0025*\0211\fF\001\013G>dG.Z2uS>t\027BA/[\005!IE/\032:bi>\024\bbB0\001\003\003%\t\001Y\001\tG\006tW)];bYR\021\021\r\032\t\003'\tL!a\031\013\003\017\t{w\016\\3b]\"9AKXA\001\002\004\001\006b\0024\001\003\003%\teZ\001\tQ\006\034\bnQ8eKR\t!\nC\004j\001\005\005I\021\t6\002\021Q|7\013\036:j]\036$\022\001\021\005\bY\002\t\t\021\"\021n\003\031)\027/^1mgR\021\021M\034\005\b).\f\t\0211\001Q\017\035\001(!!A\t\002E\fa\001R8mY\006\024\bCA\bs\r\035\t!!!A\t\002M\0342A\035;\031!\021)\bP\b\026\016\003YT!a\036\013\002\017I,h\016^5nK&\021\021P\036\002\022\003\n\034HO]1di\032+hn\031;j_:\f\004\"\002\025s\t\003YH#A9\t\017%\024\030\021!C#U\"9aP]A\001\n\003{\030!B1qa2LHc\001\026\002\002!)A$ a\001=!I\021Q\001:\002\002\023\005\025qA\001\bk:\f\007\017\0357z)\021\tI!a\004\021\tM\tYAH\005\004\003\033!\"AB(qi&|g\016C\005\002\022\005\r\021\021!a\001U\005\031\001\020\n\031\t\023\005U!/!A\005\n\005]\021a\003:fC\022\024Vm]8mm\026$\"!!\007\021\007\005\013Y\"C\002\002\036\t\023aa\0242kK\016$\b")
public class Dollar extends Amount implements Product, Serializable {
  private final String value;
  
  public static Option<String> unapply(Dollar paramDollar) {
    return Dollar$.MODULE$.unapply(paramDollar);
  }
  
  public static Dollar apply(String paramString) {
    return Dollar$.MODULE$.apply(paramString);
  }
  
  public static <A> Function1<String, A> andThen(Function1<Dollar, A> paramFunction1) {
    return Dollar$.MODULE$.andThen(paramFunction1);
  }
  
  public static <A> Function1<A, Dollar> compose(Function1<A, String> paramFunction1) {
    return Dollar$.MODULE$.compose(paramFunction1);
  }
  
  public String value() {
    return this.value;
  }
  
  public Dollar copy(String value) {
    return new Dollar(value);
  }
  
  public String copy$default$1() {
    return value();
  }
  
  public String productPrefix() {
    return "Dollar";
  }
  
  public int productArity() {
    return 1;
  }
  
  public Object productElement(int x$1) {
    int i = x$1;
    switch (i) {
      default:
        throw new IndexOutOfBoundsException(BoxesRunTime.boxToInteger(x$1).toString());
      case 0:
        break;
    } 
    return value();
  }
  
  public Iterator<Object> productIterator() {
    return ScalaRunTime$.MODULE$.typedProductIterator(this);
  }
  
  public boolean canEqual(Object x$1) {
    return x$1 instanceof Dollar;
  }
  
  public int hashCode() {
    return ScalaRunTime$.MODULE$._hashCode(this);
  }
  
  public String toString() {
    return ScalaRunTime$.MODULE$._toString(this);
  }
  
  public boolean equals(Object x$1) {
    // Byte code:
    //   0: aload_0
    //   1: aload_1
    //   2: if_acmpeq -> 80
    //   5: aload_1
    //   6: astore_2
    //   7: aload_2
    //   8: instanceof com/ruozedata/bigdata/scala04/casepkg/Dollar
    //   11: ifeq -> 19
    //   14: iconst_1
    //   15: istore_3
    //   16: goto -> 21
    //   19: iconst_0
    //   20: istore_3
    //   21: iload_3
    //   22: ifeq -> 84
    //   25: aload_1
    //   26: checkcast com/ruozedata/bigdata/scala04/casepkg/Dollar
    //   29: astore #4
    //   31: aload_0
    //   32: invokevirtual value : ()Ljava/lang/String;
    //   35: aload #4
    //   37: invokevirtual value : ()Ljava/lang/String;
    //   40: astore #5
    //   42: dup
    //   43: ifnonnull -> 55
    //   46: pop
    //   47: aload #5
    //   49: ifnull -> 63
    //   52: goto -> 76
    //   55: aload #5
    //   57: invokevirtual equals : (Ljava/lang/Object;)Z
    //   60: ifeq -> 76
    //   63: aload #4
    //   65: aload_0
    //   66: invokevirtual canEqual : (Ljava/lang/Object;)Z
    //   69: ifeq -> 76
    //   72: iconst_1
    //   73: goto -> 77
    //   76: iconst_0
    //   77: ifeq -> 84
    //   80: iconst_1
    //   81: goto -> 85
    //   84: iconst_0
    //   85: ireturn
    // Line number table:
    //   Java source line number -> byte code offset
    //   #12    -> 0
    // Local variable table:
    //   start  length  slot    name    descriptor
    //   0  86  0   this    Lcom/ruozedata/bigdata/scala04/casepkg/Dollar;
    //   0  86  1   x$1 Ljava/lang/Object;
  }
  
  public Dollar(String value) {
    Product.class.$init$(this);
  }
}

1、样例类默认实现了序列化,实现了scala的Product
2、构造器中的value当成了属性,且默认都是val(对应Java的final)
3、默认实现了apply和unapply,这就是为何样例类不用new可以直接使用的原
4、默认实现了常用的toString/equals/hashCode/copy方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352