无法推断 Class<> 的类型参数

paw*_*len 5 java generics

我的排序测试应用程序有问题,我在其中使用了比较器。我收到一条消息:

线程“main”中的异常 java.lang.Error:未解决的编译问题:无法推断 Sorter<> 的类型参数

对于该代码:

public class TestClass {

    public static void main(String[] args){

            Sorter<Person> idSorter = new Sorter<>(new idComparator());
    .
    .
    .
    }
}
Run Code Online (Sandbox Code Playgroud)

分拣机类:

public class Sorter<T extends Comparable> {

    Comparator<T> comparator;
    int switches = 0,
        compares = 0;

    public Sorter(Comparator<T> comparator) {
        this.comparator = comparator;
    }

    public Sorter() {
        this.comparator = null;
    }

    protected int compare(T first, T second) {
        if (this.comparator == null) {
            int cmp = first.compareTo(second);
            this.compares++;
            return cmp;
        }
Run Code Online (Sandbox Code Playgroud)

比较界面:

public interface Comparable {
    public int compareTo(Comparable other);
}
Run Code Online (Sandbox Code Playgroud)

idComparator 类:

public class idComparator implements Comparator<Integer> {

    public int compare(Integer first, Integer second) {
        return first > second? 1: first == second? 0: 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

比较器接口:

public interface Comparator<T> {
    int compare(T first, T second);
}
Run Code Online (Sandbox Code Playgroud)

这样的用法有什么问题?我怎样才能做得更好?

小智 7

在这一行:

Sorter<Person> idSorter = new Sorter<>(new idComparator());
Run Code Online (Sandbox Code Playgroud)

idComparator实现Comparator<Integer>所以Tfor Sorteris Integer,但是您的声明向编译器指示Tis Person,因此编译器感到困惑并发出消息。

可能的修复

Sorter<Integer> idSorter = new Sorter<>(new idComparator());
Run Code Online (Sandbox Code Playgroud)

但正如一些人在评论中所说,根据某个整数对人进行排序很奇怪


另请注意:

  • 一个return说法是(可能)失踪Sorter#compare
  • idComparator 名称应以大写字母开头: IdComparator
  • 如果你真的想使用你自己的Comparable/Comparator你应该用其他名字(MyComparable?)命名它们,as is与java的混淆。