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不知道如何比较这些元素。