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
相关产品推荐
相关产品推荐

