获取泛型类的类型?

时间:2011-06-30 14:04:36

标签: java generics

具有声明为此的方法的类:

public class A{
    public <T> T test(java.lang.Class<T> classOfT)
}

通常可以针对这样的对象调用它:

A a = new A()
String s = "test";
a.test(String.class); //I wrote this as s.class at first,which is wrong.Thanks Nick.

现在我想概括传递给它的对象,所以我声明了一个这样的类:

public class B <T>{
    private A a   = new A();
    private T obj = null;
    T test(){return a.test(obj.getClass()); } 
}

但代码不会'编译。我想知道是否有可能实现我的目标?

提前感谢Java大师;)

4 个答案:

答案 0 :(得分:3)

T obj = ...;
obj.getClass()

最后一行返回Class<? extends T> - 但T无界限,因此它基本上以Object为界,这意味着它返回Class<? extends Object>,这与Class<?>

这样做:

T test () { return a.test(obj.getClass()); }

实际上会使用a.test类型的参数调用Class<?>,该参数返回Object,而不是T

只需将参数转换为Class<T>或将返回类型转换为T,它应该有效 - 尽管我还不明白为什么你需要这样的东西。此外,原帖中还有这个奇怪的错误:

 String s = "test";
 a.test(s.class);

执行"test".class是错误的 - 它应该是String.class

答案 1 :(得分:2)

Class<T> clazz  = (Class<T>) obj.getClass();
return a.test(clazz);

答案 2 :(得分:1)

尝试

@SuppressWarnings("unchecked")
T test() {
    return (T) a.test(obj.getClass());
}

答案 3 :(得分:0)

作为其他答案的补充,将您的功能定义为

public class A{
    public <T> T test(java.lang.Class<T> classOfT) { ... }
}

如果您使用classOfT参数来确定T的类型,那么最好不要使用任何参数来定义方法。例如,这样做而不是上面的声明:

public class A{
    public <T> T test() { ... }
}

这样你就可以使用这种合格的方法调用语法来调用它。这就是我重写代码的方式:

public class A{
    public <T> T test() {
          // ...
    }        

    public static void main(String[] args) {
          A a = new A();
          String result = a.<String>test(); 
    }
}

public class B <T> {
    private A a = new A();

    T test() {
        return this.a.<T>test();
    }
}

这样,您就不需要向泛型A#test()函数传递一个类参数,该参数可能在运行时未被使用。 当然如果你在运行时使用classOfT,这个解决方案对你来说可能没那么有趣......