Collections.sort () генерирует ошибку времени компиляции для универсального списка - PullRequest
0 голосов
/ 28 сентября 2019

Почему этот код выдает ошибку времени компиляции?

interface Pair<K, V> extends Comparable<OrderedPair<K, V>> {
    K getKey();

    V getValue();
}


class OrderedPair<K, V> implements Pair<K, V> {

    private K k;
    private V v;

    public OrderedPair(K k, V v) {
        this.k = k;
        this.v = v;
    }

    @Override
    public K getKey() {
        return k;
    }

    @Override
    public V getValue() {
        return v;
    }

    @Override
    public int compareTo(OrderedPair o) {
        return this.getKey().toString().compareTo(o.getKey().toString());
    }
}


public class Operation {

    public static void main(String[] args) {
        List<Pair<String, String>> list = new ArrayList() {{
            add(new OrderedPair("BCA", "29"));
            add(new OrderedPair("CAB", "31"));
            add(new OrderedPair("ABC", "30"));
        }};
        Collections.sort(list); // showing compile time error

    }
}

1 Ответ

0 голосов
/ 28 сентября 2019

Насколько я понимаю, вы пытаетесь реализовать структуру данных Pair, которую вы хотели бы сохранить в списке, а затем отсортировать, используя Collections.sort на основе ключей Pair

Проблема в вашем коде в том, что вы используете Collections.sort, который принимает List<T> list, где T расширяется Comparable<? super T>.В основном это означает Collections.sort Принимает T, который расширяет сам себя.

т.е. в вашем случае Вы должны расширить Comparable с Pair вместо OrderedPair<String,String>.Вы можете дополнительно изменить интерфейс на класс Abstract и реализовать compareTo в самом классе Pair.Вот код с небольшими изменениями в вашем коде.

abstract class Pair<K, V> implements Comparable<Pair> {
    abstract K getKey();

    abstract V getValue();

    @Override
    public int compareTo(Pair o) {
        return this.getKey().toString().compareTo(o.getKey().toString());
    }
}


class OrderedPair<K, V> extends Pair<K, V> {

    private K k;
    private V v;

    public OrderedPair(K k, V v) {
        this.k = k;
        this.v = v;
    }

    @Override
    public K getKey() {
        return k;
    }

    @Override
    public V getValue() {
        return v;
    }
}


class Operation {

    public static void main(String[] args) {
        List<Pair<String, String>> list = new ArrayList() {{
            add(new OrderedPair("BCA", "29"));
            add(new OrderedPair("CAB", "31"));
            add(new OrderedPair("ABC", "30"));
        }};
        Collections.sort(list); // showing compile time error

    }
}

Попробуйте это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...