Java:抽象通用数据上下文类

问题描述

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

应用程序数据类 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 解决方案(所以如果可能的话,不要使用代码生成器)。如果反射不会以严重的方式减慢数据访问速度,那么反射就可以了。

解决方法

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

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]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...