[java] Wie bekomme ich das `.class` Attribut von einem generischen Typparameter?



0 Answers

W ist möglicherweise aufgrund von Typlöschen nicht verfügbar. Sie sollten verlangen, dass eine Class<W> an die Methode übergeben wird. Sie erhalten ein Klassenobjekt und sein generisches stellt sicher, dass nur W und keine Unterklasse aufgrund der Kovarianz übergeben wird.

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

wird W.class aber nicht WSubtype.class .

Question

Die akzeptierte Antwort auf diese Frage beschreibt, wie eine Instanz von T in der Generic<T> -Klasse erstellt wird. Dazu muss ein Class<T> -Parameter an den Generic Konstruktor übergeben und die newInstance Methode newInstance werden.

Eine neue Instanz von Generic<Bar> wird dann erstellt und der Parameter Bar.class wird übergeben.

Was tun Sie, wenn der generische Typparameter für die neue Generic Klasse keine bekannte Klasse wie Bar aber selbst ein generischer Typparameter ist? Angenommen, ich hätte eine andere Klasse Skeet<J> und ich wollte eine neue Instanz von Generic<J> aus dieser Klasse erstellen. Dann, wenn ich versuche, J.class zu übergeben, J.class ich den folgenden Compilerfehler:

cannot select from a type variable.

Gibt es einen Weg dazu?

Das spezifische Bit des Codes, das den Fehler für mich auslöst, ist:

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();
      /* ... */
    }
    /* ... */
  }
  /* ... */
}

Der Fehler passiert, weil ich W.class nicht schreiben W.class . Gibt es eine andere Möglichkeit, dieselben Informationen weiterzugeben?




Related