CategoryDao dao = new CategoryDaoImpl();很好理解但是下面代码我几有点迷惑了
package cn.factory;import cn.dao.CategoryDao;
import cn.dao.impl.CategoryDaoImpl;
import cn.domain.Category;public class DaoFactory {

private DaoFactory(){}
private static DaoFactory instance = new DaoFactory();

public static DaoFactory getinstance(){
return instance;          
}


public <T> T createDao(String classname,Class<T> clazz){

try {
T t = (T) Class.forName(classname).newInstance();
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}不用泛型public CategoryDao createCategoryDao(String classname){

try {
CategoryDao dao = (CategoryDao) Class.forName(classname).newInstance();
return dao;
} catch (Exception e) {
throw new RuntimeException(e);


}
得到实例CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl",CategoryDao.class);
//CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl");
很明显Class.forName(classname).newInstance()得到是接口实现类为什么还需要强转想了很久CategoryDao dao = new CategoryDaoImpl();两个感觉视乎矛盾了 难道是反射机制问题 :cry: .
求解...  :oops: 

解决方案 »

  1.   


    CategoryDao dao = new CategoryDaoImpl();那你为什么这样,为什么不这样写CategoryDaoImpl dao = new CategoryDaoImpl();面向接口编程的好处。或者说如果你下次
    Class.forName(classname).newInstance()得到是另一个CategoryDao接口实现类,那你不是要改代码。
    个人见解,仅供参考!
      

  2.   

    因为 Class.forName 返回的是 Class<?> 类型,所以 Class<?>.newInstance 函数就只能返回“?”类型了…… ^_^ 只好强制转换……
      

  3.   

    如果是CategoryDao create(Class<? extends CategoryDao> cl) {
        try {
            CategoryDao x = cl.newInstance();
            return x;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    },调用的时候用:CategoryDao a = create(CategoryDaoImpl.class);就可以了
      

  4.   

    没有什么不明白的
    Class.forName(classname).newInstance();
    这句话没有带任何类型进去,所以不可能出来一个不需要转型的
      

  5.   

    很明显Class.forName(classname).newInstance()得到是接口实现类为什么还需要强转
    你知道不一定代表计算机知道。强转就是把你知道的告诉计算机
      

  6.   

    无语,,,这样是多态的做法 提高可扩展性...蛋疼的问题
    = =classname只是一个字符串 这样是为了降低解耦度0 0,
      

  7.   

    CategoryDao dao = (CategoryDao) Class.forName(classname).newInstance();Class.forName("XXXX") ,这句话作用是要求JVM查找并加载指定的类,返回的是一个类对象(Class对象).然后通过反射调用newInstance() 生成类的实例 (该类必须有默认构造函数才行)。Class.forName(classname).newInstance() 很显然 返回的是一个Object ,然后使用强制类型向上转型为正确的类型.(编译器只知道是个Object,但并不知道是哪个类,需要强制转换)转换为CategoryDao接口类型,是非常有好处的。比如你的接口CategoryDao 分别有三种实现方案:
    基于hibernate持久层的 cn.dao.impl.categoryDaoHibernateImpl
    基于ibatis持久层的 cn.dao.impl.categoryDaoIbatisImpl
    基于JDBC的cn.dao.impl.categoryDaoJdbcImpl以上三个类型字符串 都可以替换以下的字符串 xxxx
    CategoryDao dao = (CategoryDao) Class.forName(xxxxx).newInstance();这样一来,灵活性就很大,我可以随时更换DAO层的实现技术,而代码需要改变的地方就是xxxx这里。