Java:获取泛型类

时间:2015-07-08 22:28:27

标签: java generics guava

我有一个通用类

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类型的对象。 我怎样才能做到这一点?

提前致谢!

1 个答案:

答案 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;
    }
}

您可以对此进行扩展并让调用者注册一个用于解析类的回调,但这可能有点过分......