java downcast导致方法不适用错误

时间:2016-07-25 16:40:07

标签: java collections

我正在尝试向我的数据库对象转发一个函数。我明白了:

  

类型中的方法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排序。

1 个答案:

答案 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,可以让你把东西放在地图上而不知道会发生什么。)