Scala:Trait Companion对象在Java中不可见

时间:2012-02-24 18:29:24

标签: java scala

Scala 中的特征的伴随对象在Scala中没有可见性问题

trait ProtocolPacket extends Serializable {    
  def toByteArray: Array[Byte]
}

object ProtocolPacket {
  def getStreamType( streamBytes: Array[Byte] ) = {
    // ...
  }
}

然而,在Java方面(例如在jar中获取上述内容),ProtocolPacket.getStreamType不可见。事实上,(由IDEA反编译)来源没有为getStreamType

定义ProtocolPacket方法

编辑:

关于Companion$MODULE$,我在SO上发现了类似的点击,但被IDEA欺骗了:),如下所示:

enter image description here

以上编译并运行正常(shell和/或IDEA本身),以防其他人被困。

2 个答案:

答案 0 :(得分:6)

查看javap输出,您会发现:

$ javap ProtocolPacket
public interface ProtocolPacket extends scala.Serializable{
    public abstract byte[] toByteArray();
}

和伴侣对象:

$ javap ProtocolPacket$
public final class ProtocolPacket$ extends java.lang.Object implements scala.ScalaObject,scala.Serializable{
    public static final ProtocolPacket$ MODULE$;
    public static {};
    public void getStreamType(byte[]);
    public java.lang.Object readResolve();
}

这让我相信你可以写的Java:

ProtocolPacket$.MODULE$.getStreamType(/**/)

答案 1 :(得分:2)

我认为Java中的ProtocolPacket$.MODULE$.getStreamType()但我没有仔细检查过。

另见How do you call a Scala singleton method from Java?