Почему я должен разыграть этот универсальный тип? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь создать сопоставимый узел, содержащий только сопоставимые объекты.

Из того, что я понимаю в Java, переменная-член value должна иметь тип E, поэтомупозже, когда я обращаюсь к нему в compareTo(), он все равно должен иметь тип E и не должен нуждаться в приведении, но компилятор сообщает мне, что это не так с:

incompatible types: java.lang.Comparable cannot be converted to E.

Я думаю, что это уже должен быть тип E.Почему я должен привести o.value к типу E при первом использовании, а не при втором?Чего мне не хватает?

Код ниже.

public class fakenode<E extends Comparable<E>> implements Comparable<fakenode> {
 public E value;

 fakenode (E value)
 {
    this.value = value;
 }

 @Override
 public int compareTo(fakenode o) {
    value.compareTo((E)o.value); // Why must I cast o to type E here?
    o.value.compareTo(value);    // This one works just fine

    return -1;
 }

1 Ответ

4 голосов
/ 14 апреля 2019

Вы исключили параметр универсального типа E из двух мест, где вы используете тип fakenode.

Должно быть:

class fakenode<E extends Comparable<E>> implements Comparable<fakenode<E>> { // first change
    public E value;

    fakenode (E value)
    {
        this.value = value;
    }

    @Override
    public int compareTo(fakenode<E> o) { // second change
        value.compareTo(o.value);
        o.value.compareTo(value);

        return -1;
    }
}

Полагаю, это не совсем логика вашего compareTo метода, поскольку он всегда возвращает -1.

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