1. ホーム
  2. java

[解決済み] Class<> の型引数を推論できない

2022-02-28 14:48:10

質問

私のソートテストアプリでコンパレータを使用していて問題があります。 メッセージが表示されました。

スレッドで例外発生 "main" java.lang.Error: 未解決のコンパイル問題です。 Sorter<> の型引数を推論できません。

そのコードに対して

public class TestClass {

    public static void main(String[] args){

            Sorter<Person> idSorter = new Sorter<>(new idComparator());
    .
    .
    .
    }
}

ソーター(Sorter)クラス。

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;
        }

比較可能なインターフェース。

public interface Comparable {
    public int compareTo(Comparable other);
}

idComparator クラスです。

public class idComparator implements Comparator<Integer> {

    public int compare(Integer first, Integer second) {
        return first > second? 1: first == second? 0: 1;
    }
}

Comparator インターフェース。

public interface Comparator<T> {
    int compare(T first, T second);
}

このような使い方のどこがいけないのでしょうか?どうすればもっと良くなるのでしょうか?

解決方法は?

この行の中に

Sorter<Person> idSorter = new Sorter<>(new idComparator());

idComparator インプリメント Comparator<Integer> ということで T に対して SorterInteger しかし、あなたの宣言は とは はコンパイラに TPerson というメッセージが表示され、コンパイラは混乱します。

修正候補 :

Sorter<Integer> idSorter = new Sorter<>(new idComparator());

が、コメントで何人かが言っているように、それは というのは、ある整数値に基づいて人を並べ替えることです。


また、注意してください。

  • a return の文は、(おそらく)欠落しています。 Sorter#compare
  • idComparator の名前は大文字で始まる必要があります。 IdComparator
  • をどうしても使いたい場合は Comparable / Comparator を使用する場合は、他の名前を付けてください ( MyComparable ?) as is javaのものと混同している。