2010-11-07 79 views
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可以是e发送一种FirstInnerClass或SecondInnerClass。这是那次谈话e.Handler于(A)是导致以下错误:

java.lang.ClassCastException: java.lang.Class 

我已经与调试输出e.Handler确实是一个类类型FirstOuterClass $ FirstInnerClass的验证。所以无论在C#& Java(可能)之间进行强制转换,还是在某处(也可能)都没有提供正确的语法。我很抱歉没有粘贴整个代码,就像HashMap的用处一样,我不想混淆真正的问题,基本上它是一个String键和几个扩展类之间的映射抽象答:)

+0

它看起来很好,但为什么e.Handler的静态类型不是A,所以你避免了剧组,并从它的源头得到问题? – 2010-11-07 18:44:12

+0

你可以提供更多关于HashMapOfStringToEntry的数据吗?你的foreach循环令人困惑。地图返回条目并且您正在使用其他内容。它看起来像返回Entry的本地实现,可能对此有所帮助。 – Bivas 2010-11-07 18:47:16

回答

3

如果你的内部类之一是未能转换为A,那么你的例外是这样的:

java.lang.ClassCastException: FirstOuterClass$FirstInnerClass cannot be cast to A

相反,你得到这样的:

java.lang.ClassCastException: java.lang.Class

你切断“在这个结尾不能投给A”?

无论如何,看起来e.Handler的类型是java.lang.Class。如在,FirstOuterClass$FirstInnerClass本身,而不是它的一个单一的实例。

+0

你说得对,但我不知道为什么。如果我在e.Handler上做一个instanceof检查,我将它设置为java.lang.Class - 它不会将自己标识为子类... – GJTorikian 2010-11-07 20:00:58

+0

实际上,我想我已经明白了,正如您所说。我没有实例化对象;我只是通过e.Handler.class,实际上。有没有办法比较非实例化对象的类继承? – GJTorikian 2010-11-07 20:11:10

+0

想通了。需要我的类来实现java.lang.reflect.Type并将类实例化为对象。对不起3条评论,我似乎无法编辑我的。标记为答案。谢谢! – GJTorikian 2010-11-07 20:43:04

0

从异常消息看来,您似乎试图投射Class的实例,而不是它所代表的类的实例。

相关问题