collection接口不能直接实例化,因其是无构造方法的抽象顶层接口,必须通过arraylist等实现类或supplier工厂创建具体实例。

Java 中 Collection 接口本身是抽象的,不能直接实例化;而 Supplier
Collection 接口为何不能直接 new
Collection 是 Java 集合框架的顶层接口,定义了 add、remove、size 等通用行为,但没有构造方法。你无法写 new Collection<string>()</string>,必须使用它的实现类,比如 ArrayList、LinkedHashSet、CopyOnWriteArrayList 等。
- 编译期只知道它是泛型接口,运行时擦除后更无类型信息
- Stream.collect() 要求明确的容器生成逻辑,不能靠类型推断自动构造
- 不同场景需要不同集合语义:去重选 HashSet,有序选 LinkedHashSet,线程安全选 CopyOnWriteArrayList
Supplier 就是“集合工厂”
Supplier 的核心是 T get() 方法,无参、有返回。把它用作集合工厂,本质是把“造什么集合”的决策权交给调用方,而不是硬编码在工具方法里。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 你可以传
() -> new ArrayList(),也可以传LinkedList::new或TreeSet::new - 支持带参数构造:比如
() -> new ArrayList(initialCapacity) - 配合 Stream 使用时,直接作为 Collectors.toCollection 的参数
典型用法:流收集回指定 Collection 子类型
比如你想把一个 Stream
Stream<string> stream = Arrays.stream(new String[]{"a", "b", "a"});
Collection<string> result = stream.collect(Collectors.toCollection(LinkedHashSet::new));</string></string>
这里 LinkedHashSet::new 就是 Supplier() -> new LinkedHashSet()。
- 若封装成通用工具方法,签名通常为:
<t c extends collection>> C collectTo(Stream<t> s, Supplier<c> factory)</c></t></t> - 调用时明确指定目标类型:
collectTo(stream, TreeSet::new)或collectTo(stream, () -> new CopyOnWriteArrayList()) - 避免类型转换,保持泛型安全:返回值 C 直接就是你要的子类型,不是 raw Collection
为什么不用 Collections.emptyList() 这类静态工厂?
它们返回的是不可变集合或特殊实现(如空集合、单例视图),无法用于收集新元素。Supplier 提供的是可变、可扩展、可定制的实例,适合做收集目标。
- Collections.unmodifiableXXX 返回的是装饰器,add 操作会抛 UnsupportedOperationException
- Arrays.asList() 返回固定大小列表,add/remove 可能失败
- Supplier 保证每次调用都返回全新、干净、可写的集合实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










