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 类型。正是 e.Handler 与 (A) 的对话导致了以下错误:

java.lang.ClassCastException: java.lang.Class

我已经通过调试输出验证了 e.Handler 确实是 FirstOuterClass$FirstInnerClass 的类类型。因此,要么 C# 和 Java 之间的转换存在差异(可能),要么我没有在某处提供正确的语法(也可能)。

(我很抱歉没有粘贴整个代码,就像 HashMaps 的用途一样。我不想混淆真正的问题。基本上它是一个字符串键和几个扩展抽象 A 的类之间的映射。)

4

2 回答 2

2

如果您的内部类之一未能转换为A,那么您的异常将如下所示:

java.lang.ClassCastException:FirstOuterClass$FirstInnerClass 不能强制转换为 A

相反,你得到这个:

java.lang.ClassCastException: java.lang.Class

您是否在此结束时切断了“无法转换为 A”?

无论如何,它似乎e.Handler是 type java.lang.Class。如,FirstOuterClass$FirstInnerClass它本身而不是它的单个实例。

于 2010-11-07T19:03:39.187 回答
0

从异常消息中,您似乎正在尝试强制转换 的实例Class,而不是它所代表的类的实例。

于 2010-11-07T19:02:18.877 回答