我希望能够在运行时对我的方法调用的返回类型进行detirmine,但我似乎无法获得T的类型。
public <T> T getT()
{
Object t = null;
Class<?> c = t.getClass();
System.out.println(c.getName());
return (T) t;
}
有没有办法在Java中确定运行时的T类型?
答案 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。只有在泛型中的所有信息在编译后都消失了。