如何将带通配符返回类型的泛型函数返回值赋值给指定泛型对象
解决方案
问题原因
- 你调用的
create方法返回值的第一个泛型参数是无界通配符?,Java编译器的通配符捕获机制无法确认这个?的实际类型就是你需要的String,因此直接赋值会触发类型不匹配错误。 - 方法签名里仅声明了第二个泛型参数
<V>,没有对第一个泛型参数做约束,所以编译器默认推导第二个泛型参数为Object,进一步加剧了类型不匹配问题。
可行解决方法
方案1:显式强制类型转换(使用第三方库无法修改源码时推荐)
如果你能确认运行时返回的Channel实例第一个泛型参数实际为String、第二个为SomeClassType,可以直接做unchecked强制转换:
// 调用时先显式指定V的类型为SomeClassType,再做强制转换 Channel<String, SomeClassType> result = (Channel<String, SomeClassType>) creatorObj.<SomeClassType>create(setting);
如果编译器弹出unchecked警告,确认类型符合预期的前提下,可以在当前方法上添加@SuppressWarnings("unchecked")注解关闭警告。
方案2:修正方法签名(可修改库源代码时推荐)
如果这个create方法是你自己维护的代码,说明方法签名设计存在缺陷,没有声明第一个泛型参数,修正为以下形式即可直接使用:
// 补上第一个泛型参数K的声明 <K, V> Channel<K, V> create(@Nonnull ChannelSetting setting);
修正后调用时直接指定泛型参数即可,不需要额外转换:
Channel<String, SomeClassType> result = creatorObj.<String, SomeClassType>create(setting);
内容的提问来源于stack exchange,提问作者MADHAVI KUMARI
相关产品推荐
相关产品推荐

