该问题的可接受答案描述了如何T在Generic<T>类中创建的实例。这涉及将Class<T>参数传递给Generic构造函数并newInstance从中调用方法。
T
Generic<T>
Class<T>
Generic
newInstance
Generic<Bar>然后创建的新实例,并Bar.class传递参数。
Generic<Bar>
Bar.class
如果新Generic类的泛型类型参数不是某个已知类,Bar但它本身是泛型类型参数,该怎么办?假设我还有其他班级Skeet<J>,我想Generic<J>从该班级内部创建一个新实例。然后,如果尝试传递,则会J.class收到以下编译器错误:
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。还有其他传递相同信息的方式吗?
W.class
使用.class一个类型参数是不允许的- 因为类型擦除,W将被 清除 ,以Component在运行时。InputField还将需要Class<W>从呼叫者那里收取,例如InputFieldArray:
.class
W
Component
InputField
Class<W>
InputFieldArray
public InputField(String labelText, Class<W> clazz) { super(new String[] {labelText}, clazz); }