如何从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
将在运行时被擦除到Component
。 InputField
也需要从调用者中获取一个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);