Связанное несоответствие: общий класс (универсального класса, расширяющего Comparable (универсального класса, расширяющего Comparable))

Я знаю, это звучит запутанно, но это лучшее, что я мог объяснить. (Вы можете предложить лучшее название). У меня 3 класса: -

A

public class A <T extends Comparable<T>> {
    ...
}

B

public class B {
    A<C> var = new A<C>(); 
    // Bound mismatch: The type C is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type A<T>
    ...
}

C

public class C <T extends Comparable<T>> implements Comparable<C>{
    private T t = null;
    public C (T t){
        this.t = t; 
    }
    @Override
    public int compareTo(C o) {
        return t.compareTo((T) o.t);
    }
    ...
}

Я получаю сообщение об ошибке при попытке создать экземпляр A в B

Связанное несоответствие: тип C не является допустимой заменой ограниченного параметра ‹T extends Comparable‹ T>> типа A


person Vikrant Goel    schedule 03.05.2015    source источник
comment
Во-первых, ваш C - это необработанный тип в B. А также в compareTo методе C. Здесь происходит сильное смешение исходных типов и дженериков - и именно поэтому у вас есть проблемы.   -  person Boris the Spider    schedule 04.05.2015
comment
Да, но если он реализует Comparable, разве это не сработает? Или еще лучше, есть ли способ заставить его работать?   -  person Vikrant Goel    schedule 04.05.2015
comment
Нет. Потому что ваш C<T> сопоставим только с rawtype C. Как я уже сказал, вам нужно еще немного почитать.   -  person Boris the Spider    schedule 04.05.2015
comment
Попался! Скажем, я хочу, чтобы целые числа сохранялись, это должно быть A<C<Integer>> var = new A<C<Integer>();   -  person Vikrant Goel    schedule 04.05.2015


Ответы (1)


Благодаря комментариям выше @Boris the Spider

Проблема в том, что C - это необработанный тип в B. Изменен экземпляр, чтобы включить параметр (в зависимости от необходимости)

A< C<Integer> > var = new A< C<Integer> >();

РЕДАКТИРОВАТЬ 1: Кроме того, благодаря комментарию ниже. Лучше изменить метод compareTo в C на это,

public int compareTo(C<T> o) {
    return t.compareTo(o.t);
}

РЕДАКТИРОВАТЬ 2: Кроме того, в вопросе есть опечатка (с комментариями ниже)

public class C <T extends Comparable<T>> implements Comparable< C<T> >{...}
person Vikrant Goel    schedule 03.05.2015
comment
Вы также используете необработанный тип C в самом C. - person Paul Boddington; 04.05.2015
comment
Ты прав! Хотя в этом нет необходимости, но я получил предупреждение. - person Vikrant Goel; 04.05.2015
comment
Другое место, где вы используете необработанный тип C, - это public class C <T extends Comparable<T>> implements Comparable<C>. Должно быть public class C <T extends Comparable<T>> implements Comparable<C<T>>. Если вы используете необработанные типы, могут произойти действительно очень странные вещи, поэтому избегайте их любой ценой. - person Paul Boddington; 04.05.2015