您在代码中所做的是尝试使用对 Class 实例的引用,名为 a 的类型参数。
但类型参数必须是文字类型名称,例如String 或输入参数。
您只能在方法或类上声明类型参数。
所以你可以在你的方法上定义一个类型参数(例如T)并在你的代码中使用它,如下所示:
<T> void myMethod() {
//...
SimpleTableModel currentTbModel = (SimpleTableModel)jTable.getModel();
Class<T> a =(Class<T>) currentTbModel.getModelClass();
NewFrame1<T> newWindow = new NewFrame1<T>();
newWindow.setVisible(true);
}
注意T没有添加任何信息,它只是一个句柄,所以你可以用通配符替换它:
void myMethod() {
//...
SimpleTableModel currentTbModel = (SimpleTableModel)jTable.getModel();
Class<?> a =(Class<T>) currentTbModel.getModelClass();
NewFrame1<?> newWindow = new NewFrame1<?>();
newWindow.setVisible(true);
}
您无法真正改进这一点,因为类型参数存在于编译时,而类实例存在并运行时,因此它们不会影响类型参数。
这也意味着NewFrame 的类型参数不能在构造函数中使用。
如果你想这样做,你必须将类实例作为参数传递给构造函数:
void myMethod() {
//...
SimpleTableModel currentTbModel = (SimpleTableModel)jTable.getModel();
Class<?> a =(Class<T>) currentTbModel.getModelClass();
NewFrame1<?> newWindow = new NewFrame1<?>(a);
newWindow.setVisible(true);
}
当然,它必须在构造函数中声明,并且您可以再次使用通配符或命名类型参数,如上所述。
完整示例,我用于创建此答案:
public class Demo {
public static void main(String[] args) {
new Demo().run();
}
private void run() {
Class<?> aClassInstance = getSomeClass();
TypedClass<?> typedInstance = new TypedClass<>(aClassInstance);
}
private <T> void run2() {
Class<T> aClassInstance = (Class<T>) getSomeClass();
TypedClass<T> typedInstance = new TypedClass<>(aClassInstance);
}
private Class<?> getSomeClass() {
return String.class;
}
static class TypedClass<T> {
TypedClass(Class<T> typeClass) {
}
}
}