java - 将 getClass() 与一些复杂的 Java 泛型一起使用时编译类型不匹配

标签 java generics

我有这个接口(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/

相关文章:

generics - 具有静态成员的 F# 泛型类型。这可能吗?

scala - 我可以将泛型类型参数限制为 2 个不相关的类之一吗?

java - epub 文件不可下载 [ANDROID]

java - 如何在 glassfish 上设置 HTTPS Java servlet

Java在没有HttpServletRequest的情况下在spring服务中获取上下文url

java - 在Java中,监视器和锁有什么区别

java - Groovy casting collection 不请自来

Java:使用泛型进行列表初始化(T 扩展 Enum<T> 和 AnyInterface)

java - 在此场景中使用 Java 集合

java - 如何使用泛型进行 instanceof 和类型转换