すいません。VectorクラスのtoArray(Object[] a)について質問があります。

1:Vector v = new Vector();

2:v.add("文字列1");
3:v.add("文字列2");
4:v.add("文字列3");

5-1:String[] strAry = v.toArray( new String[ v.size() ] );

5-1行目の部分でClassCastExceptionが発生してしまいます。
次のように、キャストするとうまくいくのですが、理由がわかりません。

5-2:String[] strAry = (String[]) v.toArray( new String[ v.size() ] );


質問事項
1.APIドキュメントには、「返される配列の実行時の型は、指定の配列の型です」と書いてあります。
実行時に、オブジェクトの型( new String[ v.size() ]の部分)を指定しているのに、なぜ、キャスト(String[]の部分)する必要があるのでしょうか?
「v.toArray( new String[ v.size() ] )」の時点で、String型の配列が戻ってくるわけではないのでしょうか?

2.もし、質問事項1の答えが、「戻り値がobject型の配列が返ってくるから、キャストする必要がある」というなら、
なぜ、Object[]をString[]にキャストできるのでしょうか?Object[]の中身はStringだけど、配列自体はObject型ではないのでしょうか?
つまり、この場合は、スーパークラス(Object[])をサブクラス(String[])にキャストすることができないと思うのですが・・・。

以上です。よろしくお願いいたします。