接受的答案这个问题 https://stackoverflow.com/q/1090458/1353391描述了如何创建一个实例T
in the Generic<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
。是否有其他方式传递相同的信息?
Using .class
不允许在类型参数上使用 - 因为类型擦除 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html, W
将会是erased to Component
在运行时。InputField
还需要采取Class<W>
来自呼叫者,例如InputFieldArray
:
public InputField(String labelText, Class<W> clazz)
{
super(new String[] {labelText}, clazz);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)