Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将类型转换为父抽象类?_Java_Casting_Abstract Class_Classcastexception - Fatal编程技术网

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

Java 是否可以将类型转换为父抽象类?,java,casting,abstract-class,classcastexception,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 { // def

我正在将一个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()
    }
}
再往别处

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确实是FirstOuterClass$FirstInnerClass的类类型。因此,要么C#和Java之间在强制转换方面存在差异(可能),要么我没有提供正确的语法(也可能)


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

从异常消息中,似乎您正试图强制转换
类的实例,不是它所表示的类的实例。

如果您的一个内部类未能强制转换到
A
,则您的异常将如下所示:

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

相反,您得到的是:

java.lang.ClassCastException:java.lang.Class

你是否在结尾处删掉了“不能被铸造成A”


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

看起来不错,但为什么e.Handler的静态类型不是一个,所以您可以避免强制转换,并从其源代码处获得问题?您能否提供有关HashMapOfStringToEntry的更多数据?您的foreach循环令人困惑。Map返回条目,您正在使用其他内容。看起来它返回了Entry的本地实现,这在这里可能会有所帮助。你是对的,但我不知道为什么。如果我对e.Handler进行instanceof检查,我会将其设置为java.lang.Class——它不会将自己标识为子类……事实上,我想我得到了它,正如你所说的。我没有对象的实例化;实际上,我只是通过了e.Handler.class。有没有一种方法可以比较非实例化对象的类继承。需要我的类来实现java.lang.reflect.Type并将类正确实例化为对象。很抱歉,我的3条评论似乎无法编辑。标记作为答案。谢谢大家!@GJT:提交评论后,您只能在短时间内编辑评论。编辑期结束后,请记住,您仍然可以随时删除自己的评论。