2016-03-25 3 views
3

Я искал ответ на свой вопрос так долго. Я нашел множество похожих тем, но я до сих пор не знаю, что делать.Коллекции сортировать типы дженериков java

У меня есть класс, где я хочу хранить объекты в отсортированном массиве ArrayList.

Например, я создал этот класс:

public class Kwadrat implements Comparable<Kwadrat> { 

    private int a; 

    public Kwadrat(int a){ 
     this.a = a; 
    } 

    public int get_size(){ 
     return a*a; 
    } 

    public int compareTo(Kwadrat b){ 
     if(b.get_size() > get_size()){ 
      return -1; 
     } 
     if(b.get_size() < get_size()){ 
      return 1; 
     } 
     return 0; 
    } 
} 

А вот мой Sort класс:

public class Sort <T> { 
    ArrayList<T> arraylist; 

    public Sort(){ 
     arraylist = new ArrayList<T>(); 
    } 


    public void add(T element){ 

     arraylist.add(element); 

     Collections.sort(arraylist); 



    } 
} 

Collections.sort(arraylist); еще говорит мне, что «нет ни одного случая (s) переменной типа (ов) T существует так, что T conforms to Comparable<? super T> ".

+1

Если вам нужно хранить элементы, упорядоченные, я предложил бы использовать 'TreeSet' вместо' ArrayList', который должен быть отсортирован вручную каждый раз, когда элемент находится вставлено. – Filkolev

+0

Я согласен с @Filkolev. Вам действительно нужен ArrayList (индексированный доступ)? – marcolopes

ответ

5

Ваш класс Sort в настоящее время не имеет границ по своему типу параметра T, поэтому он может быть любого типа, даже такого типа, который не является Comparable. Он принял бы Object, который не является Comparable. Потому что нет границ и потому, что компилятор видит, что существуют ограничения на то, что может быть передано в single-arg Collections.sort method, есть ошибка вашего компилятора.

Вы должны были создать те же границы на T, что и Collections.sort.

public class Sort <T extends Comparable<T>> { 

Или еще лучше:

public class Sort <T extends Comparable<? super T>> { 
3

Изменить T на T extends Comparable<T> в строке public class Sort <T> {, так как для этого метода требуется параметр <T extends Comparable<? super T>>.