You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:15:03