6

汎用スタックの実装では、次のイディオムが使用され、問題なく動作します

public class GenericStack<Item> {
    private int N;
    private Item[] data;    

    public GenericStack(int sz) {
        super();
        data = (Item[]) new Object[sz];

    }
        ...
}

ただし、次のことを試みると、 ClassCastException が発生します

String[] stra = (String[]) new Object[4];

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

これをどう説明しますか?

4

4 に答える 4

2

ジェネリック型の消去により、Item 配列は事実上 Object 配列になります。したがって、タイプが一致します。しかし、具象型 String でそれを行うと、そうではありません。型消去は適用されず、失敗します。

于 2013-06-14T12:38:27.750 に答える
1

Object クラス参照が String クラスやその他のクラスなどの子クラス オブジェクトを指している場合、オブジェクト クラス参照をその特定のクラス (作成して Object クラス参照に割り当てたオブジェクト) にキャストすることしかできないと思います。それへの参照。Object クラスの直接オブジェクトを作成すると (前述のように) 機能しません。

例:

Object[] obj = new String[4];
String[] stra = (String[]) obj;

上記のコードは ClassCastException を生成しません。

お役に立てれば

于 2013-06-14T12:52:44.483 に答える