使用对象的运行时类实例化泛型类

时间:2014-06-12 15:48:16

标签: java generics

我有这个通用类:

public class MyClass<T> {

    public void myMethod(T arg) {
        // ...
    }
}

如何获取此类的实例,该实例使用对象的类作为泛型类型T

如果我有:

SomeClass o = new SomeClass()

如何通过获取MyClass<SomeClass>的运行时类来获取o的实例?

基本上我需要的是这样的东西(我知道这没有意义......它只是提出一个想法):

MyClass<o.getClass()> m = new MyClass<o.getClass()>()

有可能吗?如果没有,我是否可以实现我的目标:MyClass具有一个方法,该方法采用相同类型的运行时类型o的参数? (是的,它必须是那种确切的类型,不能是超类...)

反思是一个选择!

谢谢!

1 个答案:

答案 0 :(得分:1)

由于运行时类型擦除,MyClass<X>MyClass<Y>创建的运行时对象将是相同的。可以在new MyClass<X>().myMethod()而不是X上调用Y的事实是编译时事实,而不是运行时事实。编译时问题是“可以在此变量上调用 ”,而不是“可以在具有相同getClass() ”结果的对象上调用

您可以创建工厂方法,以根据Class对象的编译时类型或您希望使用它的实际对象创建类的通用实例:

public class MyClass<T> {
    // ...

    public static <T> MyClass<T> forClass(Class<T> c) {
        return new MyClass<T>();
    }

    public static <T> MyClass<T> forObject(T object) {
        return new MyClass<T>();
    }
}

如果您希望泛型类的方法实际上具有运行时类型检查,那也是可能的。只需在Class实例中存储该类型的MyClass对象,并使用其isInstance()cast()方法检查方法的参数类型。你必须手动执行此操作,因为这不是普通泛型类通常所做的,这是因为它通常是不必要的。