универсальный класс, который реализует comparable

#java #generics #comparator #bluej

#java #общие #компаратор #bluej

Вопрос:

Мне была поставлена задача: написать общий класс WeightedElement<E,W>, в котором хранится элемент типа E и вес типа W. Он должен реализовывать Comparable, полагаясь на функцию W compareTo() . Вы должны обеспечить, чтобы W сам по себе был сопоставимым.

До сих пор я создал класс и реализовал comparable, но столкнулся с проблемой при создании метода compareTo () для W. У меня есть:

 public class WeightedElement<E, W extends Comparable<W>> {

    public E element;
    public W weight;


    public WeightedElement() {
        element = this.element;
        weight = this.weight;
    }

    public int compareTo(W data) {
        if (this.weight == data.weight) {
            return 0;
        } else if (this.weight < data.weight) {
            return 1;
        } else {
            return 1;
        }
    }
}
  

Я сталкиваюсь с проблемой, заключающейся в том, что при сравнении весов вес для данных не найден. Также существуют ли какие-либо другие методы, которые я должен создать, чтобы правильно иметь класс, который реализует comparable для одной из переменных? Спасибо за любую помощь

Комментарии:

1. В соответствии с вашим назначением ваш WeightedElement должен реализовывать Comparable . Затем, чтобы он полагался на сопоставимость W, напишите простую прокси-функцию, например public int compareTo(WeightedElement<E,W> data) { return this.weight.compareTo(data.weight); }

Ответ №1:

У вас есть правильные обобщения, но, как WeightedElement и у него, вам нужно вызывать compareTo веса — вы не можете использовать < или == для сравнения.

Ответ №2:

 public class WeightedElement<E, W extends Comparable<W>> implements Comparable<WeightedElement<E, W>> {

    private final E element;
    private final W weight;

    public WeightedElement(E element, W weight) {
        this.element = element;
        this.weight = Objects.requireNonNull(weight, "'weight' should not be null");
    }

    @Override
    public int compareTo(WeightedElement<E, W> other) {
        return other == null ? 1 : weight.compareTo(other.weight);
    }
}