1. ホーム
  2. java

[解決済み] 汎用型パラメータから `.class` 属性を取得するには?

2023-07-27 20:36:36

質問

に対する回答は この質問 のインスタンスを作成する方法について説明しています。 T の中に Generic<T> クラスで使用することができます。 これには Class<T> パラメータを Generic のコンストラクタを呼び出して newInstance メソッドを呼び出します。

の新しいインスタンスは Generic<Bar> が作成され、パラメータ Bar.class が渡されます。

の汎用型パラメータが、新しい Generic のような既知のクラスでない場合はどうなりますか? Bar のような既知のクラスではなく、それ自体が一般的な型パラメータなのでしょうか? 仮に私が他のクラス Skeet<J> の新しいインスタンスを作りたかったとします。 Generic<J> のインスタンスを作成したい。 では、もし私が J.class を渡そうとすると、以下のようなコンパイラーエラーが発生します。

cannot select from a type variable.

これを回避する方法はないのでしょうか?

私の場合、エラーを引き起こすコードの特定のビットは、次のとおりです。

public class InputField<W extends Component & WidgetInterface>
                                                 extends InputFieldArray<W>
{
  public InputField(String labelText)
  {
    super(new String[] {labelText}, W.class);
  }
  /* ... */
}

public class InputFieldArray<W extends Component & WidgetInterface>
                                                                 extends JPanel
{
   /* ... */
  public InputFieldArray(String[] labelText, Class<W> clazz)
                          throws InstantiationException, IllegalAccessException
  {
    /* ... */

    for (int i = 0 ; i < labelText.length ; i++) {
      newLabel = new JLabel(labelText[i]);
      newWidget = clazz.newInstance();
      /* ... */
    }
    /* ... */
  }
  /* ... */
}

と書くことができないので、エラーが発生します。 W.class . 同じ情報を渡す他の方法はないのでしょうか?

どのように解決するのですか?

使用方法 .class を使うことは許されません。 型の消去 , W になります。 消される になります。 Component を実行時に InputField も必要でしょう。 Class<W> のように呼び出し元から InputFieldArray :

public InputField(String labelText, Class<W> clazz)
{
    super(new String[] {labelText}, clazz);
}