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 的回调,但这可能有点矫枉过正...