这可能是一个基本问题,但是我可以这样做吗?
Class myClass = Class.forName("Integer");
SomethingSimple<myClass> obj;
其中SomethingSimple是一个非常简单的泛型类:
class SomethingSimple<T>
{
T value;
SomethingSimple() {}
public void setT(T val)
{
value = val;
}
public T getT()
{
return value;
}
}
显然,上面的代码是不正确的,因为myClass是Class类型的对象,而类是必需的。问题是如何做到这一点。我读了关于泛型反射的其他主题,但它们关注的是泛型类如何知道类型。
不,你不能那样做。有什么意义?泛型为您提供编译时类型检查,如果直到运行时才知道该类,则不会获得任何内容。
Java中的泛型仅用于编译时的静态类型检查;泛型信息在类型检查后被丢弃(请参阅类型擦除),因此SomethingSimple<Foo>
在运行时实际上只是SomethingSimple<Object>
。
当然,你不能对一个直到运行时才知道的类型进行完整的类型检查。编译器必须知道类型,这就是为什么必须使用实际的类型名称而不是Class
变量作为泛型类型参数的原因。
泛型是确保类型安全的编译时机制,而反射是运行时机制。你所说的是,"我在编译时不知道T的类型是什么,但我想要编译时类型安全"(这没有多大意义)。换句话说,java在运行时擦除T的类型,并将其存储为Object…所以T的类型(就泛型而言)不再重要。
但实际上你似乎想要一个依赖注入容器,像spring或google的伪装。