如何理解实现泛型接口时的ClassCastException。

huangapple 未分类评论49阅读模式
英文:

How to understand the ClassCastException when Implement a Generic Interface

问题

  1. 当我从Kafka消费记录时,出现了ClassCastException。
    问题是:

    1. KafkaAvroDeserializer实现了Deserializer<V>deserialize()方法返回了Object
    2. 创建了一个Consumer<String, KafkaMessage>消费者,并指定了KafkaAvroDeserializer
    3. 当我消费消息时,它看起来像是一个KafkaMessage对象,但实际上是一个Avro的GenericData
  2. 我做了一个示例:

    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);
    }
  1. 我想要问的是:
    1. 泛型类型是Object.class吗?还是泛型类型是什么?(泛型是什么东西)
    2. 在泛型不确定的情况下,如何防止这个问题?(怎么避免这样的ClassCastException
英文:
  1. when I consume records from Kafka, I got a ClassCastException.
    the problem is:

    1. KafkaAvroDeserializer implement Deserializer&lt;V&gt;, deserialize() method return Object.
    2. create a Consumer&lt;String, KafkaMessage> consumer, and specify the KafkaAvroDeserializer;
    3. when I consume the message, It seems a KafkaMessageObject, but it truly a avro GenericData/
  2. I made a demo:
    private class KafkaMessage {}

    private class AvroGeneric {}

    class Record&lt;K, V&gt; {
        K k;
        V v;
    }

    interface DeSerialize&lt;T&gt; {
        T deserializer();
    }

    class AvroDeserializer implements DeSerialize {
        @Override
        public Object deserializer() {
            return new AvroGeneric();
        }
    }

    @Test
    public void testGenericDiff() {
        // KafkaMessage is what I want.
        Record&lt;String, KafkaMessage&gt; record = new Record&lt;&gt;();

        // consume from xxx, get a AvroGenricObject. 
        DeSerialize&lt;KafkaMessage&gt; 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);
    }
  1. What I want to ask:
    1. does the generic type is Object.class? or what is generic type? (泛型是什么东西)
    2. how to prevent this problem when generic is not dependable? (怎么避免这样的ClassCastException)

huangapple
  • 本文由 发表于 2020年7月27日 16:01:04
  • 转载请务必保留本文链接:https://java.coder-hub.com/63111055.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定