2016-09-26 11 views
0

少し初心者です。面白いかどうか、私は空の型付きの配列を作成する方法を知りません。私のクラス:それらを格納Java、ハッシュマップを配列または空の配列に変換します。

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]; OKだと思われますが、まだ例外が発生します:java.lang.ClassCastException:[Ljava.lang.Object; cannot be cast to [Depot;

+2

なぜ 'new Depot [0]'だけではないのですか? – SomeJavaGuy

答えて

2

キャストする必要はありません。ただ、最初の場所でDepot[]を作成します。

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

はまたdepots.values().size() - 1、else節の配列の長さがdepots.values().size()(またはdepots.size())でなければならないことはないに注意してください。小さすぎる配列をtoArray()に渡すと、その配列はそのメソッドで使用されず、新しい配列が作成されます。

+1

OPが好きな人は、 'depots.values()。size()'を使わないのはなぜですか?マイナス1を落とすと、条件式が必要なのでしょうか? – dasblinkenlight

+1

@dasblinkenlight 'toArray()'が渡された配列を無視して十分な大きさの配列を作成するので、そのメソッドに小さすぎる配列を渡すのは意味がありません。それゆえ私はそれが意図的ではないと仮定した。 'depots.values()。toArray(new Depot [depots.size()]);'も空の場合に機能しますが、 'values()'を呼び出さないほうが少し効率的です。 Mapが空のときに 'toArray()'を実行します(おそらく目立った違いはありません)。 – Eran

関連する問題