强制类型转换问题

[code="java"]CategoryDao dao = new CategoryDaoImpl();[/code]很好理解

但是下面代码我几有点迷惑了
[code="java"]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);
    }
}

}[/code]

不用泛型
[code="java"]
public CategoryDao createCategoryDao(String classname){

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

}

[/code]

得到实例
[code="java"]
CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl",CategoryDao.class);
//CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl");
[/code]

很明显Class.forName(classname).newInstance()得到是接口实现类为什么还需要强转

想了很久[code="java"]CategoryDao dao = new CategoryDaoImpl();[/code]两个感觉矛盾了 :cry: .
求解... :oops:

动作还是慢了,为了确保能拿到这分,其实你的DaoFactory可以再完善一点
[code="java"]
public class DaoFactory {

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

public static DaoFactory getinstance(){   
    return instance;             
}   


public <T> T createDao(Class<T> clazz){   

    try {   
        return  (T) Class.forName(clazz.getName).newInstance();  
    } catch (Exception e) {   
        throw new RuntimeException(e);   
    }   
}   

}
[/code]

我个人认为这个可以从java的面向接口编程的角度来考虑,不用关心具体的实现代码,甚至于内部的实现如何变化都是没有关系的,降低耦合,这样的话会不会更容易理解呢。

从实现的角度都是可以,但是从程序结构的设计角度来讲的话。这种接口编程更灵活,更符合显示的一些概念。 :)

因为java api的clazz.newInstance()返回的是一个泛型,在没有指定时,就是一个Object对象。

[quote]Class.forName(classname).newInstance()[/quote]

其实你把这个的结果输出一下 你就看的很明白了!

通过反射创建不同对象类型没法区分。 所有对象都属于Object子类。所以返回OBJECT对象。