2

私はジェネリッククラスを試していますが、克服できないハードルに遭遇しました。要するに、なぜそれがスローされているのか理解できないエラーが発生しています:InstantiationException

ドキュメントでは、この例外を次のように定義しています。

アプリケーションがクラス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にはない外部クラス(Sandbox)の既存のインスタンスが必要です。結果として、パブリック非静的またはプライベート静的のいずれかを持つことは機能しません。

于 2012-12-29T04:49:24.027 に答える
2

zjagannathaが実際の問題を指摘した後、メソッドを非静的として保持できるようにする独自のコードの修正も見つけました...基本的に、コンストラクターのパラメーターがゼロであっても、パラメーターがゼロであるかのようにConstructor処理することを発見しました。 。パラメータを一覧表示するようになりましたが、サンドボックスクラスが必要であることがわかりました(現在作業しているクラスを想定しています)。非静的クラスを許可するには、newInstanceコードを次のように変更する必要があります。

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

これも機能します

于 2012-12-29T05:05:07.790 に答える