2

これはうまくいきます:

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

しかし、私はこの警告を取り除きたい:

「タイプ null の引数は、タイプ Class から可変引数メソッド getConstructor(Class...) を呼び出すために、Class[] に明示的にキャストする必要があります。代わりに、可変引数呼び出し用にクラスにキャストすることもできます」

4

1 に答える 1

6

あなたは言う:

これはうまくいきます:

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

実際、それは「うまくいく」わけではありません。コンパイルすると(重要な警告が表示されます)、コンパイルされたコードは実行時例外を発生させます。

あなたのコードは実際にはこれと同等です:

  this.getClass().getConstructor((Class[]) null).newInstance(null);

getConstructor((Class[]) null)問題を引き起こしているのは呼び出しです。その呼び出しは、「コンストラクターをください...しかし、引数の型が何であるかは言っていません」と言っています。それはうまくいきません。メソッドは、getConstructor(Class ...)ワイルドカード/ファジー マッチングを行いません。(コンパイラによって提案された代替手段 ... getConstructor((Class) null)... どちらも機能しません。)


それで、修正は何ですか?

  • 「引数なし」のコンストラクターを選択しようとしている場合は、次のように記述します。

     getConstructor()
    

    また

     getConstructor(new Class[0])   // equivalent
    

    または、ステートメント全体を次のように置き換えます。

     this.getClass().newInstance()
    
  • 「1 つの引数を持つ任意のコンストラクター」などを選択しようとしている場合は、 を使用する必要がありますgetConstructors()。次に、結果配列を反復処理して、必要なコンストラクターを選択する必要があります。

  • 他のことをしようとしている場合は、説明する必要があります。

于 2013-08-11T00:12:14.647 に答える