簡體   English   中英

伴隨對象中的方法在scala中編譯成靜態方法?

[英]Method in companion object compiled into static methods in scala?

看起來scala將伴隨對象中的方法編譯為靜態方法,這使得從java代碼調用它們更容易一些。 例如,您可以編寫CompanionObject.method()而不是CompanionObject $ .MODULE $ .method()。 但是,有時看似無關的代碼更改會破壞這種行為。 我想出了這個例子來說明問題

$ cat TestCompanion.scala 
class TestCompanion

object TestCompanion {
  def init2 {}
}

@SerialVersionUID(1L)
class TestCompanion2

object TestCompanion2 {
  def init2 {}
}


$ scalac -version
Scala compiler version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL

$ scalac TestCompanion.scala
$ javap TestCompanion
Compiled from "TestCompanion.scala"
public class TestCompanion extends java.lang.Object implements scala.ScalaObject{
    public static final void init2();
    public TestCompanion();
}

$ javap TestCompanion2
Compiled from "TestCompanion.scala"
public class TestCompanion2 extends java.lang.Object implements scala.ScalaObject{
    public static final long serialVersionUID;
    public static {};
    public TestCompanion2();
}

所以TestCompanion和TestCompanion2之間的唯一區別是后者用@SerialVersionUID注釋,而init2在TestCompanion中編譯成靜態方法,但在TestCompanion2中沒有。

有人可以解釋為什么scalac以不同的方式對待這兩個類嗎? 我沒有看到@SerialVersionUID注釋如何影響靜態方法的可用性。

這是一個已知的錯誤: 添加由Josh Cough提出的@SerialVersionUID后靜態轉發器丟失了 從bug的描述:

在以下代碼中,將@SerialVersionUID添加到類會導致字節代碼中缺少靜態轉發器。

object WithoutUID {
 val instance = new WithoutUID
}
class WithoutUID extends scala.Serializable

object WithUID {
 val instance = new WithUID
}
@SerialVersionUID(0) 
class WithUID extends scala.Serializable

這是相關的反編譯字節代碼:

public class WithoutUID implements Serializable, ScalaObject {
  public static final WithoutUID instance(){
    return WithoutUID.MODULE$.instance();
  }
}

public class WithUID implements Serializable, ScalaObject {
  public static final long serialVersionUID = 0L;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM