2016-09-26 96 views
0

我有點初學者。有趣與否,我不知道如何創建一個空的類型數組。我的等級:Java,將hashMap轉換爲數組或空數組

class Depot 
{ 
} 

它們存儲:

private final HashMap<Integer, Depot> depots; 
depots = new HashMap<>(); 

,我想回報他們:

public Depot[] getDepots() 
{ 
    if (depots.values().isEmpty()) 
    { 
     return (Depot[]) new Object[0]; *** 
    } 
    else 
    { 
     return depots.values().toArray(new Depot[depots.values().size()-1]); 
    } 
} 

數組。現在當沒有倉庫時,他們來了棘手的部分。首先,這條線depots.values().size()-1失敗。 return (Depot[]) new Object[0];似乎沒問題,但仍觸發異常:java.lang.ClassCastException:[Ljava.lang.Object; cannot be cast to [Depot;

+2

爲什麼不只是'新車庫[0]'? – SomeJavaGuy

回答

2

沒有必要投射。只需在第一次的地方創建一個Depot[]

public Depot[] getDepots() 
{ 
    if (depots.isEmpty()) 
    { 
     return new Depot[0]; 
    } 
    else 
    { 
     return depots.values().toArray(new Depot[depots.size()]); 
    } 
} 

還要注意的是else子句的數組的長度應該是depots.values().size()(或depots.size()),不depots.values().size() - 1。如果你將一個太小的數組傳遞給toArray(),該數組將不會被該方法使用,並且將創建一個新數組。

+1

如果OP更喜歡這樣,爲什麼不'depots.values()。size()'?一旦你減少一個,你甚至需要一個條件? – dasblinkenlight

+1

@dasblinkenlight將一個太小的數組傳遞給該方法將是毫無意義的,因爲它會導致'toArray()'忽略傳遞的數組並創建一個足夠大的數組。所以我認爲這不是故意的。儘管'depots.values()。toArray(new Depot [depots.size()])'也適用於空白的情況,但也許不會調用'values()和'toArray()'當Map是空的時候(儘管它可能不會有明顯的區別)。 – Eran