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 шт):
binarySearch ищет ключ типа Т в списке типа List<T>. Дополнительно требуется, чтобы Т был Comparable, иначе именно бинарный поиск не сможет работать (а последовательный -- сможет).
У Вас же ключ типа К ищется в списке типа List<MapEntry<K,V> -- его там просто не может быть.