Java 不存在类型变量T的实例,因此ID符合可比较的<;?超级T>;

Java 不存在类型变量T的实例,因此ID符合可比较的<;?超级T>;,java,generics,Java,Generics,我正在学习泛型,但我不知道如何解决问题 代码如下: 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)

我正在学习泛型,但我不知道如何解决问题

代码如下:

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;
    }
}
公共抽象类AbstractMapService{
受保护的映射=新的HashMap();
Set findAll(){
返回新的HashSet(map.values());
}
T findById(ID){
返回map.get(id);
}
T保存(ID,T对象){
map.put(id,object);
返回对象;
}
void deleteById(ID){
地图删除(id);
}
无效删除(T对象){
map.entrySet().removeIf(entry->entry.getValue().equals(object));
}
私有长getNextId(){
返回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>

max(java.util.Collection此错误意味着方法
Collections.max
的参数
Collection
中的元素应该实现接口。因此,它可以使用
compareTo
查找
集合中的最大元素

您可以通过以下方式声明它来编译它:

public abstract class AbstractMapService<T, ID extends Comparable<ID>> 

private ID getNextId() {
    return Collections.max(map.keySet());
}
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;
    }
}

附带说明:您可以通过
values()更改
entrySet()
,代码变得干净了一点。谢谢你的回复!ID会很长。但是为什么它只适用于ID可比扩展或ID扩展长…为什么仅仅ID是不够的?@elvis因为
ID
是类型参数,实际类型在运行时可以是任何类型。它可以是
字符串,也可以是
日期
Collections.max
在内部使用
Comparable
中声明的
compareTo
方法。如果
ID
在运行时没有方法
compareTo
,那么java不知道如何比较这些元素。