Java -使用newInstance()对泛型类与Class: InstantiationEx



我正在使用泛型类进行实验,我遇到了一个无法克服的障碍。简而言之,我遇到了一个错误,我不明白为什么它被抛出:

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

当应用程序试图使用类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)
我相信这很简单,但是我想不出这个。我试了好几种方法,但都没用。任何和所有的帮助都是感激的。

谢谢,Jon

这是因为内部类是私有的。简单解决办法:

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
    }
}

原因是类。newInstance必须能够访问要创建的类的构造函数

因为类是私有的,所以它是不可访问的。此外,为了访问非静态内部类,本质上必须有外部类(Sandbox)的现有实例,而newInstance没有。因此,无论是公有非静态还是私有静态都不能工作。

在zjagannatha指出真正的问题之后,我还找到了一个修复我自己的代码的方法,允许我将方法保持为非静态…本质上,我发现即使构造函数没有参数,Constructor也把它当作一个参数来处理。我让它列出参数,发现它需要一个沙盒类(我假设我目前正在工作的那个)。为了允许一个非静态类,我需要将我的newInstance代码更改为:

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

这个也可以

相关内容

  • 没有找到相关文章

最新更新