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

Java:如何通过泛型在运行时实例化MultiComparator

解决MultiComparator动态创建时的泛型推断问题

咱们先拆解下你遇到的编译器错误根源:当你用new MultiComparator<>(orderedContactComparators)创建实例时,Java编译器没法自动推断出泛型参数T的具体类型。你的orderedContactComparators是List<ContactComparator>类型,而MultiComparator的构造器期望的是List<Comparator<? super T>>——这里的T本应该是Contact,但编译器没法自动把这两者关联起来,所以抛出了“无法推断参数”的错误。

下面给你几个可行的解决办法:

方法1:显式指定泛型类型

直接在创建MultiComparator时明确指定T为Contact,给编译器一个明确的类型提示:

List<ContactComparator> orderedContactComparators = new ArrayList<>(); // 假设已创建
contactList.sort(
    new MultiComparator<Contact>(orderedContactComparators)
);

方法2:修正列表的泛型类型

把排序器列表的泛型声明改成List<Comparator<? super Contact>>,让它直接匹配MultiComparator构造器的参数要求,编译器就能自动完成泛型推断:

List<Comparator<? super Contact>> orderedContactComparators = new ArrayList<>();
// 示例:往列表中添加排序规则
orderedContactComparators.add(new ContactComparator(ContactComparator.Sort.NAME));
orderedContactComparators.add(new ContactComparator(ContactComparator.Sort.ID));

contactList.sort(new MultiComparator<>(orderedContactComparators));

方法3:使用MultiComparator提供的静态sort方法

你的MultiComparator类已经内置了静态sort方法,支持传入可变参数的Comparator,可以把列表转成数组传入,绕过泛型推断的问题:

List<ContactComparator> orderedContactComparators = new ArrayList<>(); // 假设已创建
MultiComparator.sort(contactList, orderedContactComparators.toArray(new Comparator[0]));

补充说明:ContactComparator实现的是Comparator<Contact>,而Comparator<? super Contact>是它的兼容超类型(因为Contact是自身的超类型),所以以上几种方法都能让编译器正确识别类型,解决构造器无法解析的问题。

内容的提问来源于stack exchange,提问作者Burton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:43:49