英文:
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语言的经验与见解,让所有开发者获益!
评论