英文:
How to understand the ClassCastException when Implement a Generic Interface
问题
-
当我从Kafka消费记录时,出现了ClassCastException。
问题是:KafkaAvroDeserializer实现了Deserializer<V>,deserialize()方法返回了Object。- 创建了一个
Consumer<String, KafkaMessage>消费者,并指定了KafkaAvroDeserializer; - 当我消费消息时,它看起来像是一个
KafkaMessage对象,但实际上是一个Avro的GenericData。
-
我做了一个示例:
private class KafkaMessage {}
private class AvroGeneric {}
class Record<K, V> {
K k;
V v;
}
interface DeSerialize<T> {
T deserializer();
}
class AvroDeserializer implements DeSerialize {
@Override
public Object deserializer() {
return new AvroGeneric();
}
}
@Test
public void testGenericDiff() {
// KafkaMessage是我想要的。
Record<String, KafkaMessage> record = new Record<>();
// 从xxx消费,得到一个AvroGenric对象。
DeSerialize<KafkaMessage> deSerialize = new AvroDeserializer();
record.v = deSerialize.deserializer();
// 这是问题所在,一个AvroGeneric对象被赋值给了一个KafkaMessage变量。
KafkaMessage v = record.v;
System.out.println(v);
}
- 我想要问的是:
- 泛型类型是
Object.class吗?还是泛型类型是什么?(泛型是什么东西) - 在泛型不确定的情况下,如何防止这个问题?(怎么避免这样的
ClassCastException)
- 泛型类型是
英文:
- when I consume records from Kafka, I got a ClassCastException.
the problem is:KafkaAvroDeserializer implement Deserializer<V>,deserialize()method returnObject.- create a
Consumer<String, KafkaMessage> consumer, and specify theKafkaAvroDeserializer; - when I consume the message, It seems a
KafkaMessageObject, but it truly a avro GenericData/
- I made a demo:
private class KafkaMessage {}
private class AvroGeneric {}
class Record<K, V> {
K k;
V v;
}
interface DeSerialize<T> {
T deserializer();
}
class AvroDeserializer implements DeSerialize {
@Override
public Object deserializer() {
return new AvroGeneric();
}
}
@Test
public void testGenericDiff() {
// KafkaMessage is what I want.
Record<String, KafkaMessage> record = new Record<>();
// consume from xxx, get a AvroGenricObject.
DeSerialize<KafkaMessage> deSerialize = new AvroDeserializer();
record.v = deSerialize.deserializer();
// this is the problem, a AvroGeneric is assigned to a KafkaMessage variable.
KafkaMessage v = record.v;
System.out.println(v);
}
- What I want to ask:
- does the generic type is Object.class? or what is generic type? (泛型是什么东西)
- how to prevent this problem when generic is not dependable? (怎么避免这样的ClassCastException)
专注分享java语言的经验与见解,让所有开发者获益!

评论