Collections.binarySearch и дженерики

Что-то совсем запутался в дженериках. Подскажите пожалуйста. Мне по задаче в классе SlowMap нужно использовать метод Collections.binarySearch в методе get().

У меня компилятор ругается на аргументы (Collections.binarySearch в классе SlowMap):

Required type List<? extends Comparable<? super T>> T Provided List<MapEntry<K, V>> K

Не пойму почему. MapEntry же реализует интерфейс Comparable. Что ему не нравится?

public class SlowMap<K extends Comparable<K>,V> extends AbstractMap<K,V> {
    public List<MapEntry<K,V>> kv=new ArrayList<>();
 
    public V put(K key, V value){
        MapEntry<K,V> temp=new MapEntry<>(key,value);
 
        for(int i=0; i<kv.size(); ++i){
            if (kv.get(i).getKey()==key){
                return (V) kv.get(i).setValue(value);
            }
        }
 
        kv.add(temp);
        Collections.sort(kv);
        return null;
    }
 
    public V get(K key){
 
        Collections.binarySearch(kv, key);
 
        for(MapEntry list: kv){
            if(list.getKey()==key){
                return (V) list.getValue();
            }
        }
        return null;
    }
 
    public String toString(){
        for(MapEntry list : kv)
            System.out.println(list.getKey() + "=" + list.getValue());
        return "";
    }
    
    public Set<Map.Entry<K,V>> entrySet(){
        Set<Map.Entry<K,V>> set=new HashSet<>();
        Iterator<MapEntry<K,V>> it=kv.iterator();
 
        for(int i=0; i<kv.size(); ++i){
            set.add(new MapEntry<K,V>((K) kv.get(i).getKey(), (V) kv.get(i).getValue()) );
        }
        return set;
    }
 
    public static void main(String[] args){
        SlowMap<String,String> m=new SlowMap<>();
        m.put("CAMEROON", "Yaounde");
        m.put("ADISABEBA", "Bumka");
        m.put("RUSSIA", "Moscow");
        System.out.println(m);
    }
}

public class MapEntry<K extends Comparable<K>,V> implements Map.Entry<K,V> , Comparable<MapEntry<K,V>>{
    private K key;
    private V value;
    public MapEntry(K key, V value){
        this.key=key;
        this.value=value;
    }
    public K getKey() {return key;}
    public V getValue() {return value;}
 
    @Override
    public int compareTo(MapEntry ob){
        K temp=(K)ob.getKey();
        return key.compareTo(temp);
    }
 
    public V setValue(V v){
        V result=value;
        value = v;
        return result;
    }
    public int hashCode(){
        return (key==null ? 0:key.hashCode()) ^ (value==null ? 0 : value.hashCode());
    }
 
    public boolean equals(Object o){
        if (!(o instanceof MapEntry)) return false;
        MapEntry me=(MapEntry) o;
        return
                (key==null?
                 me.getKey()==null : key.equals(me.getKey())) &&
                        (value==null?
                         me.getValue()==null : value.equals(me.getValue()));
    }
 
    public String toString() {return key + "=" + value;}
}

Ответы (1 шт):

Автор решения: peterz

binarySearch ищет ключ типа Т в списке типа List<T>. Дополнительно требуется, чтобы Т был Comparable, иначе именно бинарный поиск не сможет работать (а последовательный -- сможет).

У Вас же ключ типа К ищется в списке типа List<MapEntry<K,V> -- его там просто не может быть.

→ Ссылка