我正在尝试向我的数据库对象转发一个函数。我明白了:
类型中的方法GetAsStringArray(HashMap< Long,dbObject>) dbObject不适用于参数 (HashMap的<长,dbEmployee&GT)
当我尝试调用GetAsStringArray()时。这是我的测试代码: dbObject基类:
public class dbObject implements Comparable<dbObject> {
protected long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public static dbObject[] GetAsArray(HashMap<Long,dbObject> map) {
Collection<dbObject> list = map.values();
dbObject[] ar = list.toArray(new dbObject[] {});
Arrays.sort(ar);
return ar;
}
public static String[] GetAsStringArray(HashMap<Long,dbObject> map) {
Vector<String>vStrings = new Vector<String>();
Collection<dbObject> list = map.values();
dbObject[] ar = list.toArray(new dbObject[] {});
Arrays.sort(ar);
for (dbObject o : ar)
vStrings.add(o.toString());
return (String[]) vStrings.toArray(new String[] {});
}
@Override
public int compareTo(dbObject another) {
return (int)(this.getId() - another.getId());
}
}
子类dbEmployee:
public class dbEmployee extends dbObject {
private String First;
private String Last;
public dbEmployee(){}
public String toString() {
return Last + ", " + First;
}
}
错误:
public static void main(String[] args)
{
HashMap<Long,dbEmployee>mapEmployees = new HashMap<Long,dbEmployee>();
dbEmployee.GetAsStringArray(mapEmployees);
}
注意:我的一些dbObjects将拥有自己的compareTo()函数(一些对象在db中有一个字段来覆盖默认的排序顺序),但大多数项目只按id排序。
答案 0 :(得分:3)
您需要重新定义该方法:
public static dbObject[] GetAsArray(HashMap<Long, ? extends dbObject> map) {
Collection<? extends dbObject> list = map.values();
dbObject[] ar = list.toArray(new dbObject[] {});
Arrays.sort(ar);
return ar;
}
Map<Long, dbEmployee>
不能用来代替Map<Long, dbObject>
,因为虽然它有一些相同的行为,但它的一些行为却非常不同。特别是,您无法将<{1}}类型的对象添加到dbObject
。
如果方法Map<Long, dbEmployee>
允许您传递GetAsArray(HashMap<Long, dbObject> map)
,则可以从方法内部向地图添加Map<Long, dbEmployee>
。该方法无法知道地图实际上不是dbObjects
的地图。然后,如果您在方法之外继续引用地图,那么您将遇到很大问题。地图将不再是类型安全的。它会说它是dbObjects
,但它实际上包含{em>不 Map<Long, dbEmployee>
的{{1}}。
dbObjects
语法允许您指定地图 out 的内容,而无需详细说明其中的内容。您会注意到,如果您现在尝试在dbEmployees
方法中向地图添加内容,则会出现编译错误。
(有一个等效的语法,? extends dbObject
,可以让你把东西放在地图上而不知道会发生什么。)