【问题标题】:Java generic classes and non-generic classJava泛型类和非泛型类
【发布时间】:2014-03-31 11:34:52
【问题描述】:

我有点担心非泛型类中的泛型类型。我正在开发一个 API,其中我有一个数据模型,它有一个单例 DataModelManager。这个 DataModelManager 创建 DataFactory ?扩展 DMAbstractObject,其中 DMAbstractObject 是一个抽象类,告诉“我是一个 DataModel 类”。

所以基本上,当我想创建一个对象时,我使用这个代码:

DMLine 线 = DataModelManager.getInstance().getDataFactory(DMLine.class).newElement();

问题是我正在使用函数

public DataFactory<? extends DMAbstractObject> getDataFactory(Class<? extends DMAbstractObject> clazz)

所以 Java 无法知道我返回的 DataFactory 与我的参数 clazz 的类型相同。因为“?扩展 DMAbstractObject”告诉“任何扩展 DMAbstractObject 的对象”。在一个通用类中,我可以使用:“T extends DMAbstractObject”,但不是在这里。

我的数据模型管理器: 公共类 DataModelManager {

     private static DataModelManager INSTANCE;

     public static DataModelManager getInstance(){
        if(INSTANCE == null)
            INSTANCE = new DataModelManager();
        return INSTANCE;
     }  


     private HashMap<Class<? extends DMAbstractObject>, DataFactory<? extends DMAbstractObject>> dataListMap;

      /**
      * Constructor
     */
     private DataModelManager(){
        dataListMap = new HashMap<Class<? extends DMAbstractObject>, DataFactory<? extends DMAbstractObject>>();

     }

     public DataFactory<? extends DMAbstractObject> getDataFactory(Class<? extends DMAbstractObject> clazz){

         if(!dataListMap.containsKey(clazz)){
            DataFactory<? extends DMAbstractObject> dataList = new DataFactory<>(clazz);
            dataListMap.put(clazz, dataList);
            return dataList;
         }

         return dataListMap.get(clazz);


     }
 }

这不是主要问题,因为它只会导致类型安全警告(来自 DataFactory capture#2-of 的未经检查的强制转换?将 DMAbstractObject 扩展到 DataFactory DMLine),但我想知道是否有适当的方法来执行此操作。

感谢您的回答!

【问题讨论】:

    标签: java generics


    【解决方案1】:
    public <T extends DMAbstractObject> DataFactory<T> getDataFactory(Class<T> clazz)
    

    使用泛型来锁定类型。泛型可以在方法级别和类级别定义。

    【讨论】:

    • 哦,对了,我尝试了一些带有 T 扩展的东西......但没有找到让它工作的好语法,你的答案似乎很好!现在我不必每次使用 getDataFactory() 时都进行强制转换。谢谢!
    • 我相信这仍然需要在return (DataFactory&lt;T&gt;)dataListMap.get(clazz); 进行未经检查的演员表,但对于这种类型的事情通常是安全的。真的没有更好的方法来做到这一点。
    • @Radiodef 好点。鉴于上述代码,由于dataListMap 周围的条件,它是安全的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2010-10-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多