[英]Scala: Trait Companion Object is not visible in Java
A companion object for a trait in Scala has no visibility problems in Scala : 对于Scala中的一个性状A同伴对象在Scala中不可见的问题:
trait ProtocolPacket extends Serializable {
def toByteArray: Array[Byte]
}
object ProtocolPacket {
def getStreamType( streamBytes: Array[Byte] ) = {
// ...
}
}
However on Java side (eg gets the above in a jar), a ProtocolPacket.getStreamType
is not visible. 但是在Java方面(例如在jar中获取上述内容), ProtocolPacket.getStreamType
不可见。 In fact a (decompiled by IDEA) source does not have a getStreamType
method defined for a ProtocolPacket
实际上,(由IDEA反编译)源没有为ProtocolPacket
定义的getStreamType
方法
I found similar hits on SO regarding Companion$MODULE$
, but was tricked by IDEA :) as shown below: 关于Companion$MODULE$
,我在SO上发现了类似的点击,但被IDEA欺骗了:),如下所示:
The above compiles and runs fine (shell and/or IDEA itself), in case anybody else gets trapped. 以上编译并运行良好(shell和/或IDEA本身),以防其他人被困。
Looking at javap
output you will find: 查看javap
输出,您会发现:
$ javap ProtocolPacket
public interface ProtocolPacket extends scala.Serializable{
public abstract byte[] toByteArray();
}
and companion object: 和伴侣对象:
$ 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();
}
this makes me believe in Java you can write: 这让我相信你可以写的Java:
ProtocolPacket$.MODULE$.getStreamType(/**/)
I think it's ProtocolPacket$.MODULE$.getStreamType()
in Java but I haven't double checked. 我认为它是Java中的ProtocolPacket$.MODULE$.getStreamType()
但我没有仔细检查过。
See also How do you call a Scala singleton method from Java? 另请参见如何从Java调用Scala单例方法? . 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.