一尘不染

如何从泛型类型参数获取`.class`属性?

java

该问题的可接受答案描述了如何TGeneric<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。还有其他传递相同信息的方式吗?


阅读 523

收藏
2020-12-03

共1个答案

一尘不染

使用.class一个类型参数是不允许的-
因为类型擦除W将被
清除 ,以Component在运行时。InputField还将需要Class<W>从呼叫者那里收取,例如InputFieldArray

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