简体   繁体   English

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

[英]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方法

EDIT: 编辑:

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.

相关问题 Scala与Java的静态块等效吗? (没有伴随对象) - What is Scala equivalent of Java's static block? (without companion object) 在没有特征 Object 的 Scala 中重新使用 Java 通用 collections - Re-using Java generic collections in Scala without trait Object Scala中的类,对象,特征,密封特征 - Class, Object, Trait, Sealed Trait in Scala 通过 Java 反射找到 Scala 类型的伴随对象的可靠方法是什么? - What is a reliable way to find a Scala type's companion object via Java reflection? 为什么Scala伴侣对象被编译为两个类(Java和.NET编译器)? - Why is a Scala companion object compiled into two classes(both Java and .NET compilers)? 使用Scala Trait扩展Java类 - Extending Java Class with Scala Trait kotlin 中的伴生对象和 java 中的替换有什么用 - What is the use of companion object in kotlin and replacement in java 如何在 Java 中访问 Kotlin 伴侣对象? - How to access Kotlin companion object in Java? 如何从Java类中的Scala中定义的对象中获取特征类? - How to get the class of a trait within an object defined in scala from within a java class? 如何将 Scala 特征转换为 Java 类? - How to convert Scala trait to Java classes?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM