Java中Box<?>通配符转泛型T的Collection<Box<T>>实现问题
问题原因
Java泛型具备不可变特性,你定义的Multimap<String, Box<?>>调用get(boxType)返回的类型是Collection<Box<?>>,和目标声明的Collection<Box<T>>属于不兼容的泛型类型,无法直接赋值。
解决方案
通过两次显式类型转换即可实现你要的显式类型声明,同时添加@SuppressWarnings注解压制 unchecked 警告即可,该转换的类型安全性需要由你的业务逻辑自行保证:
import com.google.common.collect.Multimap; import java.util.Collection; public class GenericsTest { private final Multimap<String, Box<?>> boxMultimap; public GenericsTest(Multimap<String, Box<?>> boxMultimap) { this.boxMultimap = boxMultimap; } @SuppressWarnings("unchecked") public <T> Collection<Box<T>> get(final String boxType) { // 先转为无界通配符Collection,再转为目标泛型类型 final Collection<Box<T>> boxes = (Collection<Box<T>>) (Collection<?>) boxMultimap.get(boxType); return boxes; } }
注意事项
- 你必须保证同一个
boxType对应的所有Box实例的泛型类型完全一致,否则调用方在读取Box内存储的值时会抛出ClassCastException,且该异常不会在get方法执行时触发,排查难度较高。 - 不建议使用原始类型
Box的写法,原始类型会绕过所有泛型编译检查,容易引入隐性类型安全问题。
内容的提问来源于stack exchange,提问作者joshmmo
相关产品推荐
相关产品推荐

