1

私はC#プロジェクトをJavaに移植しているところです。次のようなコードのチャンクがあります。

public abstract class A
{
    public abstract void foo() throws Exception;
    public abstract void bar();
}

そして、他の場所で...

public class FirstOuterClass {
    public class FirstInnerClass extends A {
                  // defines foo() and bar()
    }
}

さらに他の場所...

public class SecondOuterClass {    
     public class SecondInnerClass extends A {
                  // defines foo() and bar()
    }
}

そして最後に、さらに他の場所で....

HashMap<Type, A> handlers = new HashMap<Type, A>();
        for (Entry e : HashMapOfStringToEntry.getTypes())
        {       
            if(e.Handler != null) {
                handlers.put(e.Type, (A) e.Handler);
            }
        }

e.Handlerは、FirstInnerClassまたはSecondInnerClassのいずれかのタイプにすることができます。次のエラーを引き起こしているのは、(A)への会話e.Handlerです。

java.lang.ClassCastException: java.lang.Class

デバッグ出力で、e.Handlerが実際にFirstOuterClass$FirstInnerClassのクラスタイプであることを確認しました。したがって、C#とJavaのキャストに違いがあるか(可能)、またはどこかで正しい構文を提供していません(可能です)。

(HashMapsの目的のように、コード全体を貼り付けなかったことをお詫びします。実際の問題を混乱させたくありません。基本的には、文字列キーと抽象Aを拡張するいくつかのクラス間のマッピングです。)

4

2 に答える 2

2

内部クラスの1つがへのキャストに失敗したA場合、例外は次のようになります。

java.lang.ClassCastException:FirstOuterClass$FirstInnerClassをAにキャストできません

代わりに、次のようになります。

java.lang.ClassCastException:java.lang.Class

この最後に「Aにキャストできません」を切り落としていますか?

とにかく、それe.Handlerはタイプのようjava.lang.Classです。のように、FirstOuterClass$FirstInnerClassそれの単一のインスタンスではなく、それ自体。

于 2010-11-07T19:03:39.187 に答える
0

Class例外メッセージから、それが表すクラスのインスタンスではなく、のインスタンスをキャストしようとしているようです。

于 2010-11-07T19:02:18.877 に答える