问题描述
首先定义一个Javabean:publicUser{}然后定义一个类:publicclassGenericDao<T>{privateClass<T>clazz;//定义泛型publicGenericDao(){System.out.println(clazz);}publicstaticvoidmain(String[]args){GenericDao<User>gd=newGenericDao<User>();}}运行结果为null也就是说clazz并没有被赋值,请问这是怎么回事?怎样才能赋值呢?
解决方案
解决方案二:
你的clazz没有实例化要打印肯定为null,Class类的实例化有几种方式:例如:Classstr=String.class;这种方式打印str结果就是:classjava.lang.String还有其他实例化方法自己google吧
解决方案三:
针对你的Class类使用了泛型,要想实例化:可以进行强制转化例如:Clazz=(Class<T>)String.class是同样的道理
解决方案四:
引用2楼ak47zhoujun123的回复:
针对你的Class类使用了泛型,要想实例化:可以进行强制转化例如:Clazz=(Class<T>)String.class是同样的道理
是这样,我想使用Hibernate的Session.get(Class,Serializable)方法而这个Class可能是不同的类型,因此需要使用上面的构造方式,你说的是强制转换,这个我明白,问题是在不同情况下,我根本不知道应该用哪个类进行强转……
解决方案五:
也就是说,clazz属性的类型应该是动态的,所以才需要用到泛型
解决方案六:
刚刚在这里发现一个方法:http://www.blogjava.net/calvin/archive/2006/04/28/43830.html里面提到可以用clazz=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];来动态赋值,但是我运行以后报了Exceptioninthread"main"java.lang.ClassCastException:java.lang.Class
解决方案七:
Cast抽象类型,只要求你的对象实例本身的真实类型是兼容的就行了,你直接写成(Class)xx.getClass()就行了,运行时不会出错的。importjava.util.Date;publicclassGenericDao<T>{privateClass<T>clazz;publicGenericDao(Ttarget){this.clazz=(Class)target.getClass();System.out.println(clazz);}publicstaticvoidmain(String[]args){GenericDao<String>gd=newGenericDao<String>("");GenericDao<Date>gd2=newGenericDao<Date>(newDate());}}
解决方案八:
根本就没初始化参数打印出来肯定是null了
解决方案九:
引用6楼humanity的回复:
Cast抽象类型,只要求你的对象实例本身的真实类型是兼容的就行了,你直接写成(Class)xx.getClass()就行了,运行时不会出错的。Javacodeimportjava.util.Date;publicclassGenericDao<T>{privateClass<T>clazz;publicGenericDa……
humanity的传参方式是的确可行的,非常感谢!但是如果有另一个类继承了GenericDao,则必须实现这个带参数的构造方法,要进行赋值的话,也只能通过这个带参的构造方法。这个限制貌似比较不合适。我通过上面那个网址找到一个解决方案:clazz=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];没怎么看懂……请大家指教!
解决方案十:
packagecom.test.appdemo;publicclassGenericDao<T>{privateClass<T>clazz;//定义泛型publicClass<T>getClazz(){returnclazz;}@SuppressWarnings("unchecked")publicvoidsetClazz(Tclazz){this.clazz=(Class<T>)clazz;}@SuppressWarnings("unchecked")publicGenericDao(Tuser){this.clazz=(Class<T>)user.getClass();}publicstaticvoidmain(String[]args){GenericDao<User>gd=newGenericDao<User>(newUser("Chris","Canada"));System.out.println(gd.getClazz());}}classUser{privateStringname;privateStringaddress;publicUser(Stringname,Stringaddress){this.name=name;this.address=address;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}}
解决方案十一:
ilrxx谢谢你的回复,但是你的意思实际上跟humanity是一样的,在功能上是有限制的。请关注我在8楼的回帖,非常感谢!