演员?用Java编写

时间:2014-04-11 08:57:40

标签: java casting

我正在尝试使用Generics来保持良好的抽象。

在几个班级之间移动“未经检查的演员”之后,我不得不选择哪个“未经检查的演员”是较小的邪恶,这就是我得到的:

public class DaoFactory {
    private static DaoFactory instance;
    private HashMap<String, Dao<?, BigDecimal>> registeredClasses = new HashMap<String, Dao<?, BigDecimal>>();

    private DaoFactory() {
    }

    public static synchronized DaoFactory getInstance() {
        if (instance == null)
            instance = new DaoFactory();

        return instance;
    }

    public <T> void registerDao(String daoId, Dao<T, BigDecimal> d) {
        registeredClasses.put(daoId, d);
    }

    @SuppressWarnings("unchecked")
    public <T> Dao<T, BigDecimal> createDao(String daoId) {
        return (Dao<T, BigDecimal>) (registeredClasses.get(daoId)).createDao();
    }
}

正如你所看到的,我添加了一个@SuppressWarnings("unchecked"),我收到了“未经检查的演员”警告。

问题在于:registeredClasses 不能HashMap<String, Dao<T, BigDecimal>>,因为我需要将类型参数T添加到DaoFactory class(它将是class DaoFactory<T>)。如果我添加该参数,那么instance = new DaoFactory();也需要<T>。但它在一个静态的mathod中(DaoFactory是一个单例),所以我不能使用T。所以我使用HashMap<String, Dao<?, BigDecimal>> registeredClasses代替HashMap<String, Dao<T, BigDecimal>> registeredClasses

所以我在这个工厂类里面都有“<T> - 世界”和“<?> - 世界”。所以我必须从Dao<?, BigDecimal>投射到Dao<T, BigDecimal>并使用@SuppressWarnings("unchecked")。你认为这是可以接受的吗?

1 个答案:

答案 0 :(得分:0)

我不确定这是可行的程度,因为你需要一个Class对象来强制转换;因为类型擦除将T变成对象。

public void registerDao(String daoId, Dao<Object, BigDecimal> d) {
    registeredClasses.put(daoId, d);
}

public <T> Dao<T, BigDecimal> createDao(Class<Dao<T, BigDecimal>> klazz,
                                        String daoId) {
    return klazz.cast(registeredClasses.get(daoId).createDao());
}

此处Dao包裹起来没有帮助,最好使用Class<T>