首先定义一个Javabean:
public User{}然后定义一个类:
public class GenericDao<T> {
private Class<T> clazz; //定义泛型 public GenericDao() {
System.out.println(clazz);
}
public static void main(String[] args){
GenericDao<User> gd = new GenericDao<User>();
}
}运行结果为 null也就是说clazz并没有被赋值,请问这是怎么回事?怎样才能赋值呢?
public User{}然后定义一个类:
public class GenericDao<T> {
private Class<T> clazz; //定义泛型 public GenericDao() {
System.out.println(clazz);
}
public static void main(String[] args){
GenericDao<User> gd = new GenericDao<User>();
}
}运行结果为 null也就是说clazz并没有被赋值,请问这是怎么回事?怎样才能赋值呢?
这种方式打印str 结果就是:class java.lang.String
还有其他实例化方法自己google吧
是这样,我想使用Hibernate的 Session.get(Class , Serializable)方法
而这个Class可能是不同的类型,因此需要使用上面的构造方式,你说的是强制转换,这个我明白,问题是在不同情况下,我根本不知道应该用哪个类进行强转……
http://www.blogjava.net/calvin/archive/2006/04/28/43830.html
里面提到可以用
clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
来动态赋值,但是我运行以后报了
Exception in thread "main" java.lang.ClassCastException: java.lang.Class
import java.util.Date;public class GenericDao<T> { private Class<T> clazz;
public GenericDao(T target) {
this.clazz = (Class) target.getClass();
System.out.println(clazz);
}
public static void main(String[] args){
GenericDao<String> gd = new GenericDao<String>("");
GenericDao<Date> gd2 = new GenericDao<Date>(new Date());
}
}
humanity的传参方式是的确可行的,非常感谢!但是如果有另一个类继承了GenericDao,则必须实现这个带参数的构造方法,要进行赋值的话,也只能通过这个带参的构造方法。这个限制貌似比较不合适。
我通过上面那个网址找到一个解决方案:
clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
没怎么看懂……请大家指教!
return clazz;
} @SuppressWarnings("unchecked")
public void setClazz(T clazz) {
this.clazz = (Class<T>) clazz;
} @SuppressWarnings("unchecked")
public GenericDao(T user) {
this.clazz = (Class<T>) user.getClass();
} public static void main(String[] args) {
GenericDao<User> gd = new GenericDao<User>(new User("Chris","Canada"));
System.out.println(gd.getClazz());
}
}class User{
private String name;
private String address;
public User(String name, String address){
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
谢谢你的回复,但是你的意思实际上跟humanity是一样的,在功能上是有限制的。请关注我在8楼的回帖,非常感谢!