将HashMap <k,v>转换为java </v> </k,v>中的Array <v>时出错

时间:2015-03-31 21:29:00

标签: java casting hashmap

我遇到类型cas错误的问题,我无法找出它为什么会弹出...

错误消息[Ljava.lang.Object; cannot be cast to [Lnet.masterthought.cucumber.json.Stuff;

它弹出this.stuffs = (Stuff[]) sList.toArray();

任何人都知道这是什么问题?

public class Element {
    private Stuff[] stuff;

    //... getters setters

    public function updateStuff(Stuff[] newStuff) {
        Map<String, Stuff> stuffMap = new HashMap<String, Stuff>();
        for (Stuff s : this.stuffs) {
            stuffMap.put(s.getName(), s);
        }

        for (Stuff s : prevStuffs) {
            if (stuffMap.containsKey(s.getName())) {
                stuffMap.get(s.getName()).setValue(s.getValue());
            }
        }
        ArrayList<Stuff> sList = new ArrayList<Stuff>(stuffMap.values());
        this.stuffs = (Stuff[]) sList.toArray();
    }
}

1 个答案:

答案 0 :(得分:3)

sList.toArray();会返回Object[]。这不能成为Stuff[]的强制转换。您可以将数组转换为超类型的数组,但不能转换为子类型。

你可以得到一个Stuff[],但这有点尴尬。

this.stuffs = new Stuff[sList.size()];
sList.toArray(this.stuffs);

正如评论中所指出的,你也可以这样做:

this.stuffs = sList.toArray(new Stuff[0]);

如果传递给toArray的参数不够大,则会分配并返回相同类型的新数组。