我有这个通用类:
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
的参数? (是的,它必须是那种确切的类型,不能是超类...)
反思是一个选择!
谢谢!
答案 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()
方法检查方法的参数类型。你必须手动执行此操作,因为这不是普通泛型类通常所做的,这是因为它通常是不必要的。