-1

スタックの一般的な実装があります。このスタックのオブジェクトの名前はstakで、タイプはCharacterです。

私は試した

if ( ( ((String)(stak.head).equals("{")) && (str.charAt(i)=='}') )  { /* do something */}

コードは正しくコンパイルされますが、実行時に次のエラーが発生します。

Exception in thread "main" java.lang.ClassCastException: java.lang.Character can
not be cast to java.lang.String
        at One.main(One.java:36)

ただし、次のコードは機能します。

if ( ((Character)(stak.head) == '{') && (str.charAt(i)=='}') )  { /* do something */}

文字オブジェクトが文字列にキャストされない理由を説明してください。

4

4 に答える 4

1

Characterがではないという理由だけStringで、共通の階層に分類されないため、キャストが許可されません。コンパイラは共通の継承ツリーを共有していることを知っているので、にキャストしてみることができListます。ArrayListまた、の一般的な実装がある場合は、Stackこのような具体的な型に依存するべきではないので、コードに何が含まれているのでしょうか。

また、{変換れるのCharacterはキャストではなく、自動ボクシング/アンボクシングです。

于 2013-01-28T06:24:16.497 に答える
0

charプリミティブですが、Stringオブジェクトです。

String型のオブジェクトを作成するには、charをコンストラクターに渡す必要があります。(キャストはオブジェクトを作成しません)

于 2013-01-28T06:25:15.397 に答える
0

あなたはジェネリックスで何かをしていると主張しているので、なぜ何かをキャストするのかははっきりしていません。

そうは言っても、あなたはタイプCharacterを使って作業していると言い、スタックトレースと最初の例から、stak.head実際にはタイプであるように見えますCharacter

Stringそれを;にキャストすることはできません。それは1つではありません。それはそれと同じくらい簡単です。2つのクラスは互いに関係がありません。2番目の例は完全に冗長であり、不要stack.head ですCharacter

編集して追加:これも言及する価値があります。Characterこれは、プリミティブのラッパーであるJavaの特別なクラスcharです。あなたが言う時

if (stack.head == '{' ... ) 

のコンテンツは、stack.head自動的にボックス化されてから、charと比較され'{'ます。一重引用符はcharリテラルを示します。

于 2013-01-28T06:39:09.507 に答える
0

Can you please explain why doesn't the character object get cast into String?

これは、文字が文字列から拡張されていないためです

おそらく、使用すべきものはDeque、Stackのカスタム実装やjava.util.Stack

あなたが見ている問題を防ぐサンプルコード:

    Deque<Character> charStack = new ArrayDeque<>();
    charStack.addFirst('A');
    charStack.addFirst('B');
    System.out.println(charStack.pop()); //prints B
    charStack.addFirst("C"); //Avoids the String trap with a compilation error
于 2013-01-28T06:41:22.030 に答える