2011-04-22 63 views
1

这可能是一个基本的问题,但我可以做这样的事情:Java泛型与思考

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类型的对象,并且需要一个类。问题是如何实现这一点。我读了关于泛型反射的其他主题,但他们关心泛型类如何知道类型。

+0

另请参见http://stackoverflow.com/questions/2305629/generics-and-reflection-in-java – 2011-04-22 13:53:08

回答

3

Java中的泛型只用于编译时的静态类型检查;类型检查之后通用信息被丢弃(阅读大约type erasure),因此在运行时SomethingSimple<Foo>实际上只是SomethingSimple<Object>

当然,您不能对直到运行时才知道的类型进行补全时类型检查。编译器必须知道该类型,这就是为什么您必须使用实际类型名称而不是变量作为泛型类型参数Class

5

不,你不能那样做。重点是什么?泛型为您提供编译时类型检查,如果类在运行时才知道,则不会获得任何收益。

2

泛型是一种确保类型安全的编译时机制,而反射是一种运行时机制。你说的是,“我不知道在编译时什么类型的T是,但我想编译时间类型安全”(这没有多大意义)。换句话说,java会在运行时擦除T的类型并将其作为Object存储...因此T的类型(就泛型而言)不再重要。

但真的好像你想要一个依赖注入容器,像春天或谷歌的幌子。

+0

有关泛型的信息在运行时不会完全丢失 - 请参见http://docs.oracle.com/javase/ 6/docs/api/java/lang/reflect/Type.html 以及相关方法,例如http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html#getGenericReturnType – mvmn 2013-10-09 12:50:32