【发布时间】:2018-05-24 13:58:26
【问题描述】:
我喜欢 Kafka,但讨厌编写大量的序列化器/反序列化器,所以我尝试创建一个可以反序列化泛型 T 的GenericDeserializer<T>。
这是我的尝试:
class GenericDeserializer< T > implements Deserializer< T > {
static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
}
@Override
public T deserialize( String topic, byte[] data) {
T result = null;
try {
result = ( T )( objectMapper.readValue( data, T.class ) );
}
catch ( Exception e ) {
e.printStackTrace();
}
return result;
}
@Override
public void close() {
}
}
但是,(Eclipse)Java 编译器抱怨行
result = ( T )( objectMapper.readValue( data, T.class ) );
带有消息Illegal class literal for the type parameter T。
问题:
- 您能解释一下消息的含义吗?
- 有没有办法解决这个问题以获得预期的效果?
【问题讨论】:
-
问题是,泛型类型只能在编译时用于类型检查。在运行时,所有
Ts 都替换为Object类型。因此,T.class无法评估...它被称为“类型擦除”,在 Java 中非常烦人...
标签: generic-programming apache-kafka-streams