Реализация набора деревьев Map.Entry с универсальными типами

Я создаю реализацию таблицы частот, в которой элементы таблицы хэш-карт представляют собой связанные наборы деревьев. Класс пары ключ/значение предоставляется с определением класса следующим образом:

public class CountablePair<F, S extends Comparable<? super S>> implements Comparable<S> {

Я хочу создать новый класс EntryTreeSet, который реализует Map.Entry и включает в себя набор деревьев CountablePairs. Мой текущий код для объявления класса, его переменной набора деревьев и его конструктора выглядит следующим образом:

public class EntryTreeSet<F,S> implements Map.Entry<F,S> {

private TreeSet<CountablePair<F,S>> tree;

public EntryTreeSet() {
    this.tree = new TreeSet<CountablePair<F,S>>();
}

Однако это приводит к следующим сообщениям об ошибках:

EntryTreeSet.java:19: ошибка: аргумент типа S#1 не находится в границах переменной типа S#2 private TreeSet> tree; ^ где S#1,S#2 — переменные типа: S#1 extends Object, объявленный в классе EntryTreeSet S#2 extends Comparable, объявленный в классе CountablePair EntryTreeSet.java:22: ошибка: аргумент типа S#1 не находится в границах переменная типа S#2 this.tree = new TreeSet>(); ^ где S#1,S#2 — переменные типа: S#1 extends Object, объявленный в классе EntryTreeSet S#2 extends Comparable, объявленный в классе CountablePair

Мне было интересно, как мне правильно сделать так, чтобы мой набор деревьев содержал экземпляры класса CountablePair.


person NathanForYou    schedule 24.10.2015    source источник
comment
Сразу бросается в глаза одна вещь: вы используете необработанный тип: TreeSet<CountablePair> обрабатывает CountablePair как необработанный тип. Вы должны указать его параметры в объявлении.   -  person RealSkeptic    schedule 24.10.2015
comment
Спасибо за ваш отзыв! Я обновил свой вопрос с указанными параметрами.   -  person NathanForYou    schedule 24.10.2015
comment
Придирка, но это должно быть TreeSetEntry; имя EntryTreeSet наводит на мысль, что это TreeSet of Entries.   -  person Tassos Bassoukos    schedule 24.10.2015
comment
Кроме того, вы уверены, что каждая запись вашего TreeSet будет иметь свой отдельный TreeSet?   -  person Tassos Bassoukos    schedule 24.10.2015
comment
Я бы попробовал class EntryTreeSet<F,S extends Comparable<? super S>> implements Map.Entry<F,S> как объявление второго класса.   -  person Nagy Vilmos    schedule 24.10.2015


Ответы (2)


Кажется, единственная проблема в вашем коде - это отсутствие границ для параметра S в объявлении EntryTreeSet. Такое объявление класса компилируется правильно:

public class EntryTreeSet<F, S extends Comparable<? super S>> 
                         implements Map.Entry<F, S> {
person Tagir Valeev    schedule 24.10.2015

S - необработанный тип, поэтому возникает ошибка компиляции. Попробуйте приведенный ниже код.

public class EntryTreeSet<F,S extends Comparable<? super S>> implements Map.Entry<F,S> 
person Ankush Khandekar    schedule 24.10.2015