此问题的已接受答案描述了如何T在Generic<T>类中创建实例.这涉及将Class<T>参数传递给Generic构造函数并newInstance从中调用方法.
Generic<Bar>然后创建一个新实例,并Bar.class传入参数.
如果新Generic类的泛型类型参数不是某个已知的类,Bar但它本身是泛型类型参数,您会怎么做?假设我有一些其他类Skeet<J>,我想Generic<J>从该类内部创建一个新实例.然后,如果我尝试传入,J.class我得到以下编译器错误:
cannot select from a type variable.
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?
触发错误的代码的具体位是:
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();
/* ... */
}
/* ... */
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
发生错误,因为我无法写W.class.是否有其他传递相同信息的方式?
Pau*_*ora 59
使用.class一个类型参数是不允许的-因为类型擦除,W将被清除,以Component在运行时.InputField还需要Class<W>从来电者那里取一个,比如InputFieldArray:
public InputField(String labelText, Class<W> clazz)
{
super(new String[] {labelText}, clazz);
}
Run Code Online (Sandbox Code Playgroud)
jde*_*dex 10
如果您正在使用该GSON库,则可以T通过使用轻松获得类型TypeToken.课程文档可在此处获得:
我是这样做的:
这是我的班级定义:
public class ManagerGeneric <T> {}
Run Code Online (Sandbox Code Playgroud)
这是我的方法:
// Get the type of generic parameter
Type typeOfT = new TypeToken<T>(){}.getType();
// Deserialize
T data = gson.fromJson(json, typeOfT);
Run Code Online (Sandbox Code Playgroud)
由于类型擦除,W可能无法使用.您应该要求将a Class<W>传递给方法.你得到一个类对象,它的泛型确保W由于协方差而只传入子类而不传入子类.
public InputField(String labelText, Class<W> cls)
{
super(new String[] {labelText}, cls);
}
Run Code Online (Sandbox Code Playgroud)
会采取W.class但不会WSubtype.class.
| 归档时间: |
|
| 查看次数: |
22033 次 |
| 最近记录: |