Java: 获取泛型class的Class<T>对象
Java: Get Class<T> object of generic class
我有一个通用的 class
public MyObject<T extends SomeClass1, S extends SomeClass2> extends SomeExternalClass {
// ....
@override
public void someFunction() {
ExternalClass.doSomething(T.class); // problem here!
}
}
在这个 class 中,我需要一个 Class<T>
类型的对象来将其传递给外部库的函数。外部库需要一个 Class<T extends SomeClass1>
类型的对象作为参数。
我阅读了有关将 Class<T>
传递到我的对象的构造函数的解决方案。不幸的是,MyObject 扩展了某个 class,也来自一个外部库,它有一个总是被调用的特定构造函数 - 所以这对我来说不是选择。
我阅读了有关 Guava 的信息,例如:Get generic type of class at runtime
我的问题的不同之处在于我需要一个 Class<T>
类型的对象而不是 Type
类型的对象。
我怎样才能做到这一点?
提前致谢!
正如 Pshemo 在评论中提到的那样,由于类型擦除,您不能直接在 Java 中执行此操作。但是,有几种实现方法是将 class 作为 someFunction
的参数。例如
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;
}
}
您可以对此进行扩展,让调用者注册一个用于解析 class 的回调,但这可能有点矫枉过正...
我有一个通用的 class
public MyObject<T extends SomeClass1, S extends SomeClass2> extends SomeExternalClass {
// ....
@override
public void someFunction() {
ExternalClass.doSomething(T.class); // problem here!
}
}
在这个 class 中,我需要一个 Class<T>
类型的对象来将其传递给外部库的函数。外部库需要一个 Class<T extends SomeClass1>
类型的对象作为参数。
我阅读了有关将 Class<T>
传递到我的对象的构造函数的解决方案。不幸的是,MyObject 扩展了某个 class,也来自一个外部库,它有一个总是被调用的特定构造函数 - 所以这对我来说不是选择。
我阅读了有关 Guava 的信息,例如:Get generic type of class at runtime
我的问题的不同之处在于我需要一个 Class<T>
类型的对象而不是 Type
类型的对象。
我怎样才能做到这一点?
提前致谢!
正如 Pshemo 在评论中提到的那样,由于类型擦除,您不能直接在 Java 中执行此操作。但是,有几种实现方法是将 class 作为 someFunction
的参数。例如
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;
}
}
您可以对此进行扩展,让调用者注册一个用于解析 class 的回调,但这可能有点矫枉过正...