如何从genericstypes参数中获取`.class`属性?

这个问题被接受的答案描述了如何在Generic<T>类中创build一个T的实例。 这包括将一个Class<T>parameter passing给Generic构造函数,并从中调用newInstance方法。

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

如果新Generic类的genericstypes参数不是像Bar这样的已知类,而是genericstypes参数,你该怎么办? 假设我有一些其他的类Skeet<J> ,我想从该类中创build一个新的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 。 有没有其他方式传递相同的信息?

在types参数上使用.class是不允许的 – 因为types擦除 , W将在运行时被擦除ComponentInputField也需要从调用者中获取一个Class<W> ,比如InputFieldArray

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

W可能由于types擦除而不可用。 您应该要求将一个Class<W>传递给该方法。 你得到一个类对象,它的generics确保只有W和没有子类被传入,由于协方差。

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

将采取W.class而不是WSubtype.class

我是这样做的:

这是我的class级定义:

 public class ManagerGeneric <T> { 

这是我的方法:

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