我有这个接口(interface)的方法:
public <A extends Message, B extends Message> MessageConverter<A, B>
getDefaultConverterFor(Class<A> inputClass, Class<B> outputClass);
这里的想法是,您有一个 A 类型的消息,您希望将其转换为 B 类型的消息,并且您希望从可用的已注册转换器的存储库中获取一个转换器来执行此操作。不幸的是,我很难让两端的类型按预期工作。
更具体地说,我正在尝试这样做:
public <M extends Message> Message convert(M m)
{
MessageConverter<M, DictMessage> converter =
getDefaultConverterFor(m.getClass(), DictMessage.class);
return converter.convert(m);
}
(即获取任何类型的消息并将其转换为 DictMessage)但它在 getDefaultConverter 行上给我一个编译错误:
Type mismatch: cannot convert from MessageConverter<capture#1-of ? extends Message,DictMessage> to MessageConverter<Message,DictMessage>".
我什至不确定为什么会发生这种情况,更不用说如何解决了。我想这与 getClass 返回的类与 M 不太匹配有关,但我真的不知道。我可以相信这可能实际上是行不通的,但我想不出任何打破它的具体例子......想法?
最佳答案
我遇到了 Object.getClass() 返回 Class<?>
的问题一段时间。编译器不知道 m.getClass()
是Class<M>
但你可以用类型转换来解决这个问题。
@SuppressWarnings("unchecked")
MessageConverter<M, DictMessage> converter =
getDefaultConverterFor((Class<M>) m.getClass(), DictMessage.class);
关于java - 将 getClass() 与一些复杂的 Java 泛型一起使用时编译类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8703941/