Java 如何获取并使用对象的类作为泛型类的参数?

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

在如何使用getClass()为我的泛型类获取T时,我遇到了一些问题。我想按原样做以下工作:

    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) {

        }
    }

}