2015-03-31 76 views
-2

我无法用一个类型CAS的错误,我不能找出为什么它不断坡平铸造的HashMap 到阵列 ... 错误在Java

错误消息[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(); 
    } 
} 

回答

3

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

你可以得到Stuff[],但它有点尴尬。

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

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

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

如果传递给toArray的说法是不够大,同类型的新数组分配并返回。

+3

或更简单:'sList.toArray(new Stuff [0]);' – assylias 2015-03-31 21:33:35

+0

@assylias谢谢你。我不知道你可以这样做。 'toArray' API是一条全狗早餐。 – 2015-03-31 21:41:04