Java:抽象通用数据上下文 class
Java: Abstract generic data context class
我想将所有应用程序数据存储在数据上下文中 class。
具有应用程序数据 classes A
和 B
实现 IApplicationData
,非抽象、非通用版本可能如下所示:
NonGenericDataContext
private List<A> aList;
private List<B> bList;
public List<A>getAs() {
return aList;
}
public List<B>getBs() {
return bList;
}
现在我想从具体的应用程序中抽象出来 classes 并使用通用数据上下文在多个应用程序中使用通用功能。数据上下文 class 可能如下所示:
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()
的 return 值。
问题如何改进代码以实现抽象的、通用的(不一定是 JLS 意义上的,但具有类似的可用性)数据上下文class?
我想坚持使用纯 Java 解决方案(因此如果可能的话不要使用代码生成器)。如果反射不会以关键方式减慢数据访问速度,那么反射就可以了。
您必须参数化您的泛型函数(class 不必是抽象函数):
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]
我想将所有应用程序数据存储在数据上下文中 class。
具有应用程序数据 classes A
和 B
实现 IApplicationData
,非抽象、非通用版本可能如下所示:
NonGenericDataContext
private List<A> aList;
private List<B> bList;
public List<A>getAs() {
return aList;
}
public List<B>getBs() {
return bList;
}
现在我想从具体的应用程序中抽象出来 classes 并使用通用数据上下文在多个应用程序中使用通用功能。数据上下文 class 可能如下所示:
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()
的 return 值。
问题如何改进代码以实现抽象的、通用的(不一定是 JLS 意义上的,但具有类似的可用性)数据上下文class?
我想坚持使用纯 Java 解决方案(因此如果可能的话不要使用代码生成器)。如果反射不会以关键方式减慢数据访问速度,那么反射就可以了。
您必须参数化您的泛型函数(class 不必是抽象函数):
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]