应通过方法重载统一处理多种输入形态:支持collection、string[]、string等,优先接收接口而非具体实现,避免泛型擦除冲突,最终归一化为iterator处理,并明确null语义。

直接用集合配合方法重载做兼容处理,本质不是“把集合当参数传进去”,而是让工具类能自然接纳不同形态的输入(比如 List、Set、数组、甚至单个元素),再统一归一化为标准处理流程。关键不在集合本身,而在重载如何覆盖常见容器类型,并避免歧义。
覆盖主流集合接口,不绑定具体实现
工具类应优先接受接口而非具体类,保证扩展性:
-
parse(Collection<string> items)</string>—— 兼容ArrayList、LinkedHashSet、Arrays.asList()等所有标准集合 -
parse(String[] items)—— 覆盖数组场景,内部转为Arrays.asList(items)后复用 Collection 版本 -
parse(String item)—— 单个字符串视为长度为 1 的逻辑集合,避免调用方手动包装 - 不提供
parse(ArrayList<string>)</string>或parse(LinkedList<string>)</string>这类具体类型重载,否则会引发泛型擦除冲突或冗余分支
处理泛型擦除带来的重载陷阱
Java 泛型在运行时被擦除,所以以下写法编译不通过:
-
void handle(List<string> list)</string>和void handle(List<integer> list)</integer>—— 擦除后都是handle(List),构成重复定义 - 正确做法是用类型区分:例如
handle(List> list)+ 类型检查,或改用更上层的接口如Iterable<t></t> - 若需支持多种元素类型,可设计为
<t> void parse(Iterable<t> source, Function<t string> mapper)</t></t></t>,靠泛型方法+函数式参数解耦
与流包装策略协同,统一入口
集合只是输入形态之一,要和文件、字节、路径等其他来源保持行为一致:
- 所有重载最终都导向同一核心方法,例如
doProcess(Iterator<string> iter)</string> -
parse(Collection<string> c)</string>→c.iterator() -
parse(String[] a)→Arrays.stream(a).iterator() -
parse(Path p)→Files.lines(p).iterator() - 这样既复用逻辑,又确保空集合、null 安全、资源释放等统一管控
规避常见歧义和误用
重载组合不当容易让编译器无法抉择:
- 避免同时存在
parse(Collection<string>)</string>和parse(Object... items):传parse("a", "b")会匹配可变参数,但parse(Arrays.asList("a","b"))又走集合版,语义割裂 - 若必须支持可变参数,建议命名区分:
parseAll(String... items)明确表达“多个独立项”,而parse(Collection<string>)</string>表达“已有集合结构” - null 值需明确定义:集合重载中,
parse((Collection<string>) null)</string>应抛NullPointerException,而非静默跳过;单个parse((String) null)可按业务决定是否允许











