是否可以将类型转换为父类抽象类?

时间:2010-11-07 18:34:33

标签: java casting abstract-class classcastexception

我正在将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#和C&C之间存在差异。 Java(可能)或我没有在某处提供正确的语法(也可能)。

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

2 个答案:

答案 0 :(得分:3)

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

  

java.lang.ClassCastException:FirstOuterClass $ FirstInnerClass无法强制转换为A

相反,你得到了这个:

  

java.lang.ClassCastException:java.lang.Class

你是否在这结束时切断了“不能被投到A”?

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

答案 1 :(得分:0)

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