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

2022-08-31 11:45:35

此问题的可接受答案描述了如何在类中创建 的实例。这涉及将参数传递给构造函数并从中调用方法。TGeneric<T>Class<T>GenericnewInstance

然后创建 一个新的实例,并传入该参数。Generic<Bar>Bar.class

如果新类的泛型类型参数不是某个已知的类,而是它本身是泛型类型参数,该怎么办?假设我有其他一些类,我想从该类内部创建一个新的实例。然后,如果我尝试传入,我得到以下编译器错误:GenericBarSkeet<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


答案 1

不允许在类型参数上使用 - 由于类型擦除,将在运行时擦除到。 还需要从调用方那里取一个,例如:.classWComponentInputFieldClass<W>InputFieldArray

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

答案 2

如果您使用的是 Gson 库,则可以使用 轻松获取 的类型。课程文档可从以下位置获得TTypeToken

我是这样做的:

这是我的类定义:

public class ManagerGeneric <T> {}

这是我的方法:

// Get the type of generic parameter
Type typeOfT = new TypeToken<T>(){}.getType();
// Deserialize
T data = gson.fromJson(json, typeOfT);

推荐