在下面的代码中,我得到了java.lang.InstantiationException
(下面是编译独立编译的代码 - 在我的应用程序中,我想维护一个Enum->类映射,并在从文件中读取整数值时,实例化查看地图的相应类。)
如何摆脱错误?有语法问题吗?我必须使用接口吗?我在这里的理解是有限的。
class Main {
abstract class Base {
Base() {};
void print() {
System.out.println("I am in Base");
}
}
class D1 extends Base {
D1() {};
@Override
void print() {
System.out.println("I am in D1");
}
}
static Class<? extends Base> getMyClass() {
return D1.class;
}
public static void main(String[] args) {
try {
Class<?> cc = getMyClass();
Object oo = cc.newInstance();
Base bb = (Base) oo;
bb.print();
} catch (Exception ee) {
System.out.println(ee);
};
}
};
答案 0 :(得分:5)
您的代码有两个问题:
Base
和D1
是非静态内部类。这意味着他们可以访问声明类(Main
)的字段和方法,因此它们应该保存对Main
实例的引用。因此,它们的构造函数具有类型Main
的隐式参数,用于传递该引用。因此,它们没有no-args构造函数,您应该使用单参数构造函数:
Object oo = cc.getConstructor(Main.class).newInstance(new Main());
或者,您只需将其声明为static
,或在Main
之外声明它们 - 在这种情况下,他们将无法访问Main
的成员,也不会需要参考它。
D1
的构造函数应为public
。否则,您需要致电setAccessible(true)
以使其可供反思。
答案 1 :(得分:0)
由于类Base
和D1
都是具有相同时间的内部类,因此它们是非静态内部类,因此可以通过在Main类中创建对象内部类来访问它们的方法,并且可以调用它们Main构造函数中的方法看起来像这样..
class Main {
Main(){
D1 dd = new D1();
}
abstract class Base {
Base() {};
void print() {
System.out.println("I am in Base");
}
}
class D1 extends Base {
D1() {};
@Override
void print() {
System.out.println("I am in D1");
}
}
}
希望这会对你有所帮助..谢谢