83

この質問に対する受け入れられた回答Tは、Generic<T>クラスでのインスタンスを作成する方法を説明しています。これには、コンストラクターにClass<T>パラメーターを渡し、そこからメソッドを呼び出すことが含まれます。 GenericnewInstance

の新しいインスタンスが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。同じ情報を渡す他の方法はありますか?

4

3 に答える 3

67

.class型パラメーターでの使用は許可されていません -型 eraseのため、実行時W消去されます。次のように、呼び出し元からa も取得する必要があります。ComponentInputFieldClass<W>InputFieldArray

public InputField(String labelText, Class<W> clazz)
{
    super(new String[] {labelText}, clazz);
}
于 2013-08-15T14:56:23.640 に答える
11

型消去によりWが利用できない場合があります。Class<W>メソッドに a を渡す必要があります。クラスオブジェクトを取得すると、そのジェネリックによりW、共分散により、サブクラスのみが渡され、渡されないことが保証されます。

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

かかりW.classませんWSubtype.class

于 2013-08-15T14:56:30.477 に答える