我正在将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(可能)之间存在差异,要么我没有在某处提供正确的语法(也可能)。

(很抱歉不粘贴整个代码,就像哈希图的目的一样。我不想混淆真正的问题。基本上,这是字符串键和几个类别的映射,可以扩展抽象A。)

有帮助吗?

解决方案

如果您的一个内部课程未能投射到 A, ,那么您的例外看起来像:

java.lang.classcastException:firstouterClass $ firstInnerClass不能铸造

相反,您得到了这个:

java.lang.classcastException:java.lang.class

在此结束时,您是否切断“不能被铸成”?

无论如何,似乎 e.Handler 是类型 java.lang.Class. 。如 FirstOuterClass$FirstInnerClass 本身而不是一个实例。

其他提示

从异常消息来看,您似乎正在尝试施放一个实例 Class, ,不是其代表的类的实例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top