不存在类型变量T的实例,因此ID符合Comparable <!-?超级T->

时间:2018-08-27 15:50:51

标签: 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) {
        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>

有人可以向我解释为什么出现此错误以及如何解决该错误吗?谢谢!

1 个答案:

答案 0 :(得分:4)

此错误意味着方法Collection的参数Collections.max中的元素应实现接口Comparable。因此,它可以使用compareToCollection中查找最大元素。

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

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

private ID getNextId() {
    return Collections.max(map.keySet());
}

但是我认为这很有道理。

您可能需要重新考虑您的设计。使用您当前的代码,ID可以是任何类型。例如,可以为String。这次,您的getNextId不应该返回current maxID + 1,因为只有在您的+1ID时,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;
    }
}