Java中的通用方法,确定类型

时间:2009-07-27 01:42:26

标签: java generics types methods

我希望能够在运行时对我的方法调用的返回类型进行detirmine,但我似乎无法获得T的类型。

    public <T> T getT()
    {
        Object t = null;
        Class<?> c = t.getClass();
        System.out.println(c.getName());
        return (T) t;
    }

有没有办法在Java中确定运行时的T类型?

3 个答案:

答案 0 :(得分:5)

您的函数将抛出NullPointerException,因为您在空指针上调用“getClass”(因为t初始化为null)。此外,泛型用于提供额外的编译时类型检查。他们在运行时没有给你任何特别的东西;泛型只是使用类型Object,但会导致使用泛型对象的代码执行隐式强制转换,并使编译器知道如何使用它。

答案 1 :(得分:1)

Java泛型是一种静态类型检查功能。尝试从通用参数中检索反射瑕疵是典型的经过深思熟虑的设计。

在问题示例中,无法保证T是一个类甚至是接口。例如

List<? extends Frogs> list = thing.getT();

如果你真的想沿着这条路走(我强烈建议你不要这样做,不是我希望你注意的话),那么你可以提供一个与泛型参数静态相关的反射对象作为参数:

 public <T> T getT(Class<T> clazz) {
     Object value = map.get(clazz);
     return clazz.cast(value);
 }

答案 2 :(得分:0)

如果你有一个泛型类,你可以编写一个构造函数来获取类型并将其保存到类的成员中。这样您就可以在运行时检查Type。只有在泛型中的所有信息在编译后都消失了。