我正在学习泛型,但我不知道如何解决问题。
这是代码:
public abstract class AbstractMapService<T, ID> {
protected Map<ID, T> map = new HashMap<>();
Set<T> findAll(){
return new HashSet<>(map.values());
}
T findById(ID id) {
return map.get(id);
}
T save(ID id, T object){
map.put(id, object);
return object;
}
void deleteById(ID id){
map.remove(id);
}
void delete(T object){
map.entrySet().removeIf(entry -> entry.getValue().equals(object));
}
private Long getNextId() {
return Collections.max(map.keySet()) + 1;
}
}
这是错误:
max(java.util.Collection<? extends T>) in Collections cannot be applied to (java.util.Set<ID>)
reason: no instance of type variable(s) T exist so that ID conforms to Comparable<? super T>
有人可以向我解释为什么出现此错误以及如何解决该错误吗?谢谢!
答案 0 :(得分:4)
此错误意味着方法Collection
的参数Collections.max
中的元素应实现接口Comparable
。因此,它可以使用compareTo
在Collection
中查找最大元素。
您可以通过以下方式声明它:
public abstract class AbstractMapService<T, ID extends Comparable<ID>>
private ID getNextId() {
return Collections.max(map.keySet());
}
但是我不认为这很有道理。
您可能需要重新考虑您的设计。使用您当前的代码,ID
可以是任何类型。例如,可以为String
。这次,您的getNextId
不应该返回current maxID + 1
,因为只有在您的+1
是ID
时,Number
才有意义。
如果应该将ID
设为Long
,则不应将其声明为类型参数,可以这样写:
public abstract class AbstractMapService<T> {
protected Map<Long, T> map = new HashMap<>();
Set<T> findAll(){
return new HashSet<>(map.values());
}
T findById(Long aLong) {
return map.get(aLong);
}
T save(Long aLong, T object){
map.put(aLong, object);
return object;
}
void deleteById(Long aLong){
map.remove(aLong);
}
void delete(T object){
map.entrySet().removeIf(entry -> entry.getValue().equals(object));
}
private Long getNextId() {
return Collections.max(map.keySet()) + 1L;
}
}