型変数(S)Tのインスタンスは<同等になるようにIDの準拠を存在しませんか?スーパーT>

エルビス:

私は、ジェネリック医薬品について学んでいると私はこの問題を解決する方法がわかりません。

これはコードです:

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>

私はこのエラーを取得し、どのようにそれを解決するために、なぜ誰かが私に説明できますか?ありがとうございました!

xingbin:

このエラーは、パラメータの要素を意味CollectionメソッドのCollections.maxインタフェースを実装する必要がありますがComparableだから、使用することができますcompareToでの最大の要素を見つけることCollection

あなたはそれをこのように宣言することによって、それをコンパイルすることができます。

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

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

しかし、私はしません、これはあまり意味がと思います。

あなたのデザインを再検討する必要があります。あなたの現在のコードでは、ID任意のタイプにすることができます。exmapleのために、それは可能性があり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;
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=206494&siteId=1