エルビス:
私は、ジェネリック医薬品について学んでいると私はこの問題を解決する方法がわかりません。
これはコードです:
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;
}
}