我有一个通用类
public MyObject<T extends SomeClass1, S extends SomeClass2> extends SomeExternalClass {
// ....
@override
public void someFunction() {
ExternalClass.doSomething(T.class); // problem here!
}
}
在这个类中,我需要一个Class<T>
类型的对象将它传递给外部库的一个函数。外部库需要类型为Class<T extends SomeClass1>
的对象作为参数。
我读到了将Class<T>
传递给对象构造函数的解决方案。不幸的是,MyObject扩展了某个类,也来自一个外部库,它有一个永远被调用的特定构造函数 - 所以这对我来说是没有选择的。
我在这里阅读了番石榴,例如:Get generic type of class at runtime
我的问题的不同之处在于我需要一个Class<T>
类型的Object而不是Type
类型的对象。
我怎样才能做到这一点?
提前致谢!
答案 0 :(得分:0)
正如Pshemo在评论中所提到的,由于类型擦除,你不能直接在Java中这样做。但是,实现这一目标的几种方法是将类作为someFunction
的参数。 E.g。
public class MyObject<T extends SomeClass1, S extends SomeClass2> {
// ....
public void someFunction(Class<T> clazz) {
ExternalClass.doSomething(clazz); // problem here!
}
}
然后你会把问题进一步推出。
如果您的某个类型为T
的字段具有该类型的对象,则可以使用该字段传递给ExternalClass
,例如
public class MyObject<T extends SomeClass1, S extends SomeClass2> {
private T t;
public MyObject(T t) {
this.t = t;
}
public void someFunction() {
ExternalClass.doSomething(t.getClass()); // problem here!
}
}
如果你不能改变构造函数和someFunction
的签名,那么第三个选项就是将对你控制的setter方法的调用变为现实,例如。
public class MyObject<T extends SomeClass1, S extends SomeClass2> {
private T t;
public void someFunction() {
ExternalClass.doSomething(t.getClass()); // problem here!
}
public void setClazz(T t) {
this.t = t;
}
}
您可以对此进行扩展并让调用者注册一个用于解析类的回调,但这可能有点过分......