2013-08-17 4 views
-1

У меня возникла следующая проблема: Исключение из потока "main" java.lang.ClassCastException: java.lang.ref.SoftReference нельзя передать в java. lang.Comparablejava.lang.ref.SoftReference нельзя отнести к java.lang.Comparable

с кодом следующим образом. Благодарим за помощь!

PriorityQueue<SoftReference<Element<K, V>>> heap; 
heap.add(new SoftReference<Element<K, V>>(newElement)); 

определение класса элемента заключается в следующем

class Element<K, V> implements Comparable<Element<K, V>>{ 
     long timeStamp; 
    K key; 
    V val; 
    @Override 
    public int compareTo(Element<K, V> o) { 
    return new Long(timeStamp).compareTo(o.timeStamp); 
    } 
    Element(long ts, K key, V val){ 
     this.timeStamp = ts; 
     this.key = key; 
     this.val = val; 
     } 
} 
+1

Естественно, ссылки не реализуют Comparable. Не имеет значения, на что ссылается эта ссылка, ее ссылка PriorityQueue хочет сравнить, а не упомянутый элемент. Ваш дизайн невозможен. – Durandal

ответ

1

PriorityQueue создан без обычая Comparator ожидает его элементы для реализации Comparable и SoftReference нет. Попробуйте создать свой PriorityQueue с помощью настраиваемого Comparator, который может сравнить SoftReference s.

+0

Спасибо большое! это хорошо работает для меня. Вот код. Любые дополнительные комментарии приветствуются. Класс 'SoftReferenceComparator реализует компаратор > { \t @Override \t общественности Int сравнить (SoftReference o1, o2 SoftReference ) { \t \t возвращение o1.get(). СотрагеТо (o2.get()); \t} } '' Heap = new PriorityQueue >> (sizeLimit, новый SoftReferenceComparator <Элемент >()); ' – user2692465

Смежные вопросы