首先定义一个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并没有被赋值,请问这是怎么回事?怎样才能赋值呢?

解决方案 »

  1.   

    你的 clazz 没有实例化  要打印肯定为null, Class类的实例化有几种方式:      例如: Class str = String.class;
         这种方式打印str 结果就是:class java.lang.String
         
         还有其他实例化方法自己google吧                 
      

  2.   

    针对你的Class 类使用了泛型,要想实例化:可以进行强制转化           例如: Clazz = (Class<T>) String.class 是同样的道理
      

  3.   


    是这样,我想使用Hibernate的 Session.get(Class , Serializable)方法
    而这个Class可能是不同的类型,因此需要使用上面的构造方式,你说的是强制转换,这个我明白,问题是在不同情况下,我根本不知道应该用哪个类进行强转……
      

  4.   

    也就是说,clazz属性的类型应该是动态的,所以才需要用到泛型
      

  5.   

    刚刚在这里发现一个方法:
    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
      

  6.   

    Cast 抽象类型,只要求你的对象实例本身的真实类型是兼容的就行了,你直接写成 (Class) xx.getClass() 就行了,运行时不会出错的。
    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());
        }
    }
      

  7.   

    根本就没初始化参数  打印出来肯定是null了
      

  8.   


    humanity的传参方式是的确可行的,非常感谢!但是如果有另一个类继承了GenericDao,则必须实现这个带参数的构造方法,要进行赋值的话,也只能通过这个带参的构造方法。这个限制貌似比较不合适。
    我通过上面那个网址找到一个解决方案:
    clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    没怎么看懂……请大家指教!
      

  9.   

    package com.test.appdemo;public class GenericDao<T> { private Class<T> clazz; // 定义泛型 public Class<T> getClazz() {
    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;
    }
    }
      

  10.   

    ilrxx
    谢谢你的回复,但是你的意思实际上跟humanity是一样的,在功能上是有限制的。请关注我在8楼的回帖,非常感谢!