【问题标题】:Java: Abstract generic data context classJava:抽象通用数据上下文类
【发布时间】:2021-04-10 11:07:57
【问题描述】:

我想将所有应用程序数据存储在数据上下文类中。

让应用程序数据类 AB 实现 IApplicationData,非抽象、非泛型版本可能如下所示:

NonGenericDataContext

private List<A> aList;
private List<B> bList;

public List<A>getAs() {
    return aList;
}

public List<B>getBs() {
    return bList;
}

现在我想从具体的应用程序类中抽象出来,并使用通用数据上下文在多个应用程序中使用通用功能。数据上下文类可能如下所示:

AbstractGenericDataContext

protected Map<Class<? extends IApplicationData>, List<? extends IApplicationData>> listsByType;

public List<? extends IApplicationData> getListByType(Class<? extends IApplicationData> clazz) {
    return objectListsByType.get(clazz);
}

我很想使用适当的泛型,但 Java 在编译期间会擦除类型,因此使用 Class 的构造。不幸的是,上面的构造使代码变得繁琐,getListByType() 的返回值需要强制转换。

问题如何改进代码以实现抽象的、通用的(不一定是 JLS 意义上的,但具有相似的可用性)数据上下文类?

我想坚持使用纯 Java 解决方案(所以如果可能的话,不要使用代码生成器)。如果反射不会以关键方式减慢数据访问速度,则反射是可以的。

【问题讨论】:

    标签: java generics reflection datacontext


    【解决方案1】:

    你必须参数化你的泛型函数(类不必是抽象的):

    public class GenericContext {
    
        protected Map<Class<? extends IApplicationData>, List<? extends IApplicationData>> listsByType = new HashMap<>();
    
        public <T extends IApplicationData> List<T> getListByType(Class<T> clazz) {
            return (List<T>) listsByType.get(clazz);
        }
    
        public static void main(String[] args) {
            GenericContext context = new GenericContext();
    
            context.listsByType.put(ApplicationData.class, Arrays.asList(new ApplicationData()));
            context.listsByType.put(ApplicationData2.class, Arrays.asList(new ApplicationData2()));
    
            List<ApplicationData> list = context.getListByType(ApplicationData.class);
            System.out.println(list);
        }
    }
    

    输出

    [ApplicationData@5ca881b5]
    

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多