Java 如何获取并使用对象的类作为泛型类的参数?
在如何使用getClass()为我的泛型类获取T时,我遇到了一些问题。我想按原样做以下工作:Java 如何获取并使用对象的类作为泛型类的参数?,java,class,generics,Java,Class,Generics,在如何使用getClass()为我的泛型类获取T时,我遇到了一些问题。我想按原样做以下工作: SimpleTableModel currentTbModel = (SimpleTableModel)jTable.getModel(); Class a = currentTbModel.getModelClass(); NewFrame1<a> newWindow = new NewFrame1<a>(); newWindow.setVisi
SimpleTableModel currentTbModel = (SimpleTableModel)jTable.getModel();
Class a = currentTbModel.getModelClass();
NewFrame1<a> newWindow = new NewFrame1<a>();
newWindow.setVisible(true);
SimpleTableModel currentTbModel=(SimpleTableModel)jTable.getModel();
Class a=CurrentTModel.getModelClass();
NewFrame1 newWindow=newNewFrame1();
newWindow.setVisible(true);
我的SimpleTableModel中有getModelClass函数,如下所示:
public Class<?> getModelClass() {
return (modelData.get(0)).getClass();
}
公共类getModelClass(){
return(modelData.get(0)).getClass();
}
我想我可以用一个学生来完成这门课。为了澄清,我的SimpleTableModel、NewFrame1和调用这些函数的类都在同一个包中,而类a实际上在另一个包中。因此,当我执行.getName()时,它返回otherPackage.myClass。我不确定这是否是问题所在
我没有找到任何说明如何使用类来输入类型参数的答案,因此我希望问这个问题不会将我链接到通用的getClass解释,而不是答案。在代码中所做的是尝试使用对名为
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);
}
您无法在这方面进行真正的改进,因为类型参数在编译时存在,而类实例在运行时存在,所以它们不会影响类型参数。
这也意味着NewFrame
的类型参数不能在构造函数中使用。
如果要这样做,必须将类实例作为参数传递给构造函数:
void myMethod() {
//...
SimpleTableModel currentTbModel = (SimpleTableModel)jTable.getModel();
Class<?> a =(Class<T>) currentTbModel.getModelClass();
NewFrame1<?> newWindow = new NewFrame1<?>(a);
newWindow.setVisible(true);
}
void myMethod(){
//...
SimpleTableModel currentTbModel=(SimpleTableModel)jTable.getModel();
类a=(类)CurrentTModel.getModelClass();
NewFrame1 newWindow=新的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) {
}
}
}
公开课演示{
公共静态void main(字符串[]args){
新建Demo().run();
}
私家车{
类aclasInstance=getSomeClass();
TypedClass typedInstance=新的TypedClass(aClassInstance);
}
私有void run2(){
类aclasInstance=(类)getSomeClass();
TypedClass typedInstance=新的TypedClass(aClassInstance);
}
私有类getSomeClass(){
返回字符串.class;
}
静态类TypedClass{
TypedClass(类typeClass){
}
}
}
检查构造函数中的EnumMap
。
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) {
}
}
}