Ошибка с collections.sort (несоответствие границ)

Я должен сделать особую сортировку в объекте. Я прочитал много руководств и использовал класс Comparable.

Мои занятия:

public class PaAcao implements Serializable, IAcao, Comparable<PaAcao> /* Ordenar */  {

@Override
public int compareTo(PaAcao acaoCompara) {
    //return this.aresta - outro.aresta;
    int i = 0;
    String[] array1 = this.cnrAcao.split(".");
    String[] array2 = acaoCompara.cnrAcao.split(".");
    
    for(String c : array1){
        if (array2.length > i){             
            if (Integer.parseInt(c) > Integer.parseInt(array2[i])) 
            {
                return 1;
            }
            if (Integer.parseInt(c) < Integer.parseInt(array2[i])) 
            {
                return -1;
            }               
        }
        i++;
    }               
    return -1;
}  

Для этого класса у меня есть интерфейс:

package br.com.agraria.qualidade.model.entity;

public interface IAcao{

    public abstract String getCnmUsuarResp();   
    public abstract Usuario getusuarResp();
    public abstract void setusuarResp(Usuario usuarResp);
    public abstract PaStatusAcao getIcdStatus();
    public abstract String getCnrAcao();
    public abstract Boolean getLpublico();

}

И я получаю ошибку ниже:

public class PaAcaoServiceImpl extends HibernateGenericServiceImpl<PaAcao> implements PaAcaoService {
    @Override
    public List<? extends IAcao> processarAcoes(List<? extends IAcao> acoesProcessar) {
        SessaoPrivilegiosGerente sessaoPrivilegiosGerente = sessaoService.getSessaoPrivilegiosGerente();
        List<IAcao> macroRemover = new ArrayList<IAcao>();
    
        Collections.sort(acoesProcessar);
        
        ...

    }
}

Проблема в строке Collections.sort(acoesProcessar); я получаю сообщение:

Несоответствие границ: универсальный метод sort(List<T>) типа Collections неприменим для аргументов (List<capture#14-of ? extends IAcao>). Выведенный тип capture#14-of ? extends IAcao не является допустимой заменой ограниченного параметра <T extends Comparable<? super T>>.


person FryKlaus    schedule 13.08.2013    source источник
comment
Я не на 100%, но не должен ли интерфейс IAcao реализовывать Comparable, если список будет использовать этот тип? Если бы список был типа PaAcao, то, думаю, все было бы в порядке.   -  person Deactivator2    schedule 13.08.2013
comment
Когда вы возвращаете 0 для равного? У вас должно быть a.compareTo(b) = -b.compareTo(a), чтобы вы не могли вернуть ничего, кроме 0 для равных значений.   -  person Peter Lawrey    schedule 13.08.2013
comment
Привет, Питер, они никогда не будут равны, шанс равен 0.   -  person FryKlaus    schedule 13.08.2013
comment
Привет @Deactivator2, я уже пробовал это, но получаю сообщение об ошибке в классе PaAcao, потому что я не могу реализовать 2 сопоставимых объекта в одном классе.   -  person FryKlaus    schedule 13.08.2013
comment
@FryKlaus Верно, это потому, что у вас может быть только один класс в вашей цепочке наследования, реализующий Comparable. Другими словами, если вы объявите IAcao для реализации Comparable, вы не сможете реализовать его и в PaAcao, но метод compareTo все равно будет работать как унаследованный метод.   -  person Deactivator2    schedule 13.08.2013
comment
@Deactivator2 Deactivator2 Я пытаюсь расширить интерфейс с помощью Comparable и вывести его из класса PaPlano. Я не получаю никаких ошибок, но если я запускаю код, я получаю следующее сообщение: br.com.agraria.qualidade.model.entity.PaPlano не может быть приведен к java.lang.Comparable   -  person FryKlaus    schedule 13.08.2013
comment
@FryKlaus попробуйте public interface IAcao extends Comparable<IAcao> и удалите реализацию Comparable из объявления класса PaAcao.   -  person Deactivator2    schedule 13.08.2013
comment
@Deactivator2 я уже сделал это, но не сработало   -  person FryKlaus    schedule 13.08.2013
comment
@FryKlaus Ты сделал extends, а не implements? И, пожалуйста, отредактируйте свой вопрос, обновив весь код.   -  person Deactivator2    schedule 13.08.2013
comment
@Deactivator2 Tnxs Чувак, твои советы очень помогли, теперь все работает. Сорт неправильный, но это еще один вопрос, над которым мне придется работать сейчас! Tnxs человек!   -  person FryKlaus    schedule 14.08.2013


Ответы (1)


Решение было (спасибо Deactivator2 за помощь в этом):

Расширяет Comparable на интерфейсе IAcao:

package br.com.agraria.qualidade.model.entity;

public interface IAcao extends Comparable<IAcao>{

    public abstract String getCnmUsuarResp();   
    public abstract Usuario getusuarResp();
    public abstract void setusuarResp(Usuario usuarResp);
    public abstract PaStatusAcao getIcdStatus();
    public abstract String getCnrAcao();
    public abstract Boolean getLpublico();

}

И в моем классе PaAcao я удаляю реализации Comparable, потому что они будут дублироваться, и меняю тип os compareTo на IAcao, а не на PaAcao:

public class PaAcao implements Serializable, IAcao /* Ordenar */  {

@Override
public int compareTo(IAcao acaoCompara) {
    //return this.aresta - outro.aresta;
    int i = 0;
    String[] array1 = this.cnrAcao.split(".");
    String[] array2 = acaoCompara.cnrAcao.split(".");

    for(String c : array1){
        if (array2.length > i){             
            if (Integer.parseInt(c) > Integer.parseInt(array2[i])) 
            {
                return 1;
            }
            if (Integer.parseInt(c) < Integer.parseInt(array2[i])) 
            {
                return -1;
            }               
        }
        i++;
    }               
    return -1;
}
person FryKlaus    schedule 14.08.2013