如何在clojure中创建scala对象

如何在clojure中创建scala对象,scala,clojure,apache-kafka,Scala,Clojure,Apache Kafka,我试图在clojure中创建一个scala对象,kafka.utils.ZKStringSerializer。(位于org.apache.kafka/kafka_2.10“0.8.0”) 因为我对scala知之甚少,所以我不知道如何调用它的构造函数。我试着这样做: (import 'kafka.utils.ZKStringSerializer) (ZKStringSerializer.) ; or (new ZKStringSerializer) o

我试图在clojure中创建一个scala对象,
kafka.utils.ZKStringSerializer
。(位于
org.apache.kafka/kafka_2.10“0.8.0”

因为我对scala知之甚少,所以我不知道如何调用它的构造函数。我试着这样做:

(import 'kafka.utils.ZKStringSerializer)
(ZKStringSerializer.)                      
; or (new ZKStringSerializer)
object ZKStringSerializer extends ZkSerializer {

  @throws(classOf[ZkMarshallingError])
  def serialize(data : Object) : Array[Byte] = data.asInstanceOf[String].getBytes("UTF-8")

  @throws(classOf[ZkMarshallingError])
  def deserialize(bytes : Array[Byte]) : Object = {
    if (bytes == null)
      null
    else
      new String(bytes, "UTF-8")
  }
}
并出现错误:
CompilerException java.lang.IllegalArgumentException:找不到类kafka.utils.ZKStringSerializer的匹配构造函数

我尝试使用
(clojure.reflect/reflect ZKStringSerializer)
查看其方法,但只有一些静态方法。
(class ZKStringSerializer)
告诉我它是一个类,而不是我想要的实例

对象的实现方式如下:

(import 'kafka.utils.ZKStringSerializer)
(ZKStringSerializer.)                      
; or (new ZKStringSerializer)
object ZKStringSerializer extends ZkSerializer {

  @throws(classOf[ZkMarshallingError])
  def serialize(data : Object) : Array[Byte] = data.asInstanceOf[String].getBytes("UTF-8")

  @throws(classOf[ZkMarshallingError])
  def deserialize(bytes : Array[Byte]) : Object = {
    if (bytes == null)
      null
    else
      new String(bytes, "UTF-8")
  }
}

java
而言,所有scala对象都是单例对象。没有公共构造函数。您应该使用静态字段
模块$
来获取singleton的实例

我不知道
clojure
,但据我所知,您应该使用:

ZKStringSerializer$/MODULE$

还请注意,对象的实际类型名包含
$
作为最后一个字符。

有效!谢谢!我以前不知道
$
表示法。@halfelf:看一看同伴对象:
类测试;对象测试
。singleton的实例应该有一个类,但类名
Test
已经在使用中。scala中不推荐手动使用
$
:所有合成术语名称都包含
$
@halfelf:实际上并非所有合成术语名称都包含
$
,只有不应手动使用的方法。