Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala类final def this()不声明任何公共无参数构造函数_Java_Scala_Generics_Polymorphism_Apache Kafka - Fatal编程技术网

Java Scala类final def this()不声明任何公共无参数构造函数

Java Scala类final def this()不声明任何公共无参数构造函数,java,scala,generics,polymorphism,apache-kafka,Java,Scala,Generics,Polymorphism,Apache Kafka,试图构建一个通用的Scala2.11Jackson序列化程序,该程序使用Jackson Smile 2.6.6和Jackson模块Scala。无论出于何种原因,Java都找不到公共的无参数构造函数。尽管下面的类已编译,但我在运行时从Kafka客户端收到以下错误: Caused by: org.apache.kafka.common.KafkaException: Could not instantiate class ai.bernie.api.util.serialization.kafka.

试图构建一个通用的Scala2.11Jackson序列化程序,该程序使用Jackson Smile 2.6.6和Jackson模块Scala。无论出于何种原因,Java都找不到公共的无参数构造函数。尽管下面的类已编译,但我在运行时从Kafka客户端收到以下错误:

Caused by: org.apache.kafka.common.KafkaException: Could not instantiate class ai.bernie.api.util.serialization.kafka.JacksonGenericSerializer Does it have a public no-argument constructor?
    at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:318) ~[kafka-clients-0.10.0.0.jar:na]
    at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:201) ~[kafka-clients-0.10.0.0.jar:na]
    at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:671) ~[kafka-clients-0.10.0.0.jar:na]
    ... 27 common frames omitted
Caused by: java.lang.InstantiationException: ai.bernie.api.util.serialization.kafka.JacksonGenericSerializer
    at java.lang.Class.newInstance(Class.java:427) ~[na:1.8.0_51]
    at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:314) ~[kafka-clients-0.10.0.0.jar:na]
    ... 29 common frames omitted
Caused by: java.lang.NoSuchMethodException: ai.bernie.api.util.serialization.kafka.JacksonGenericSerializer.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_51]
    at java.lang.Class.newInstance(Class.java:412) ~[na:1.8.0_51]
    ... 30 common frames omitted
编辑
我还应该提到,我正在使用Google Guice,尽管我怀疑它是否会影响这一点,因为序列化类本身没有被注入,只有使用它的Kafka Consumer/Producer父类。

因为
JacksonGenericSerializer
类型参数有上下文绑定(即
[T:Manifest]
)辅助“无参数”构造函数实际上接受一个参数:
Manifest[T]

您可以使用javap确认这一点:

$ javap JacksonGenericSerializer.class

Compiled from "JacksonGenericSerializer.scala"
public class JacksonGenericSerializer<T> implements java.io.Closeable, java.lang.AutoCloseable, org.apache.kafka.common.serialization.Serializer<T>, org.apache.kafka.common.serialization.Deserializer<T> {
  public void configure(java.util.Map<java.lang.String, ?>, boolean);
  public byte[] serialize(java.lang.String, T);
  public T deserialize(java.lang.String, byte[]);
  public void close();
  public JacksonGenericSerializer(scala.reflect.Manifest<T>);
}
$javap JacksonGenericSerializer.class
由“JacksonGenericSerializer.scala”编译而成
公共类JacksonGenericSerializer实现java.io.Closeable、java.lang.AutoCloseable、org.apache.kafka.common.serialization.Serializer、org.apache.kafka.common.serialization.Deserializer{
公共void配置(java.util.Map,布尔值);
公共字节[]序列化(java.lang.String,T);
公共T反序列化(java.lang.String,字节[]);
公共空间关闭();
公共JacksonGenericSerializer(scala.reflect.Manifest);
}

这个问题涉及到一个类似的问题:

因为
JacksonGenericSerializer
类型参数有一个上下文绑定(即
[T:Manifest]
),辅助的“无参数”构造函数实际上接受一个参数:
Manifest[T]

您可以使用javap确认这一点:

$ javap JacksonGenericSerializer.class

Compiled from "JacksonGenericSerializer.scala"
public class JacksonGenericSerializer<T> implements java.io.Closeable, java.lang.AutoCloseable, org.apache.kafka.common.serialization.Serializer<T>, org.apache.kafka.common.serialization.Deserializer<T> {
  public void configure(java.util.Map<java.lang.String, ?>, boolean);
  public byte[] serialize(java.lang.String, T);
  public T deserialize(java.lang.String, byte[]);
  public void close();
  public JacksonGenericSerializer(scala.reflect.Manifest<T>);
}
$javap JacksonGenericSerializer.class
由“JacksonGenericSerializer.scala”编译而成
公共类JacksonGenericSerializer实现java.io.Closeable、java.lang.AutoCloseable、org.apache.kafka.common.serialization.Serializer、org.apache.kafka.common.serialization.Deserializer{
公共void配置(java.util.Map,布尔值);
公共字节[]序列化(java.lang.String,T);
公共T反序列化(java.lang.String,字节[]);
公共空间关闭();
公共JacksonGenericSerializer(scala.reflect.Manifest);
}

这个问题涉及到一个类似的问题:

很有趣,所以基本上我想要实现的是几乎不可能的,因为它可以是/或?不可能按原样使用JacksonGenericSerializer-从这里开始最直接的方法是:1)删除上下文限制2)使
JacksonGenericSerializer
抽象并添加一个抽象字段
implicit val manifest:manifest[T]
3)实现
class JacksonMyTypeSerializer扩展JacksonGenericSerializer[MyType]{implicit val manifest=implicit[manifest[MyType]}
很有趣,所以基本上我想要实现的目标是不可能的,因为它可以是/或?不可能按原样使用JacksonGenericSerializer-最直接的方法是:1)删除上下文绑定2)使
JacksonGenericSerializer
抽象并添加一个抽象字段
隐式val清单:清单[T]
3)实现
类JacksonMyTypeSerializer扩展JacksonGenericSerializer[MyType]{implicit val manifest=implicit[manifest[MyType]}