2

我正在尝试使用泛型类,但遇到了无法克服的障碍。简而言之,我遇到了一个我不明白为什么会抛出它的错误:InstantiationException

在文档中,它将此异常定义为:

当应用程序尝试使用 Class Class 中的 newInstance 方法创建类的实例,但指定的类对象由于它是接口或抽象类而无法实例化时抛出。

现在让我摸不着头脑的问题是我没有使用 abstract 或 interface 关键字。我还听说这可能是由于没有默认构造函数(我有)。可以肯定的是,我将代码减少到尽可能少,但仍然出现错误:

package Sandbox;

public class Sandbox {


    public static void main(String[] args) {
        Sandbox box = new Sandbox();
    }

    public Sandbox() {
        aMethod(subThread.class);
    }

    public void aMethod(Class<? extends superThread> type) {
        try {

            System.out.println("isInterface: "+type.isInterface());
            System.out.println("isAssignableFrom of subThread: "+type.isAssignableFrom(subThread.class));

            superThread t = type.newInstance();

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    private class superThread { // implements Runnable {

        public superThread() {}

        public void run() {}
    }

    private class subThread extends superThread {

        public subThread() {
            super();
        }

        public void run() {
            // more stuff
        }
    }
}

输出:

isInterface: false
isAssignableFrom of subThread: true
java.lang.InstantiationException: Sandbox.Sandbox$subThread
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at Sandbox.Sandbox.aMethod(Sandbox.java:20)
    at Sandbox.Sandbox.<init>(Sandbox.java:11)
    at Sandbox.Sandbox.main(Sandbox.java:7)

我敢肯定这很简单,但我无法弄清楚这一点。我已经尝试了几件事,但没有任何帮助。任何和所有的帮助表示赞赏。

谢谢,乔恩

4

2 回答 2

6

这是因为您的内部类是私有的。简单修复:

public static class superThread { // implements Runnable {

    public superThread() {}

    public void run() {}
}

public static class subThread extends superThread {

    public subThread() {
        super();
    }

    public void run() {
        // more stuff
    }
}

推理是因为 Class.newInstance 必须能够访问您要创建的类的构造函数。

由于该类是私有的,因此无法访问。此外,为了访问非静态内部类,您基本上必须拥有外部类(沙盒)的现有实例,而 newInstance 没有。结果,具有公共非静态或私有静态都行不通。

于 2012-12-29T04:49:24.027 回答
2

在 zjagannatha 指出真正的问题之后,我还找到了对我自己的代码的修复,它允许我将方法保持为非静态......基本上我发现即使构造函数的参数为​​零,Constructor也将其视为有一个. 我得到它来列出参数,发现它需要一个沙盒类(我假设我目前正在使用的那个)很奇怪为了允许一个非静态类,我需要将我的 newInstance 代码更改为:

type.getConstructor(this.getClass()).newInstance(this);

这也有效

于 2012-12-29T05:05:07.790 回答