Java泛型:如何从方法中获取泛型类型?
尽管我的问题是关于Java泛型的,但我还是放了一些与JPA相关的代码来向您展示真实的上下文 我正在使用JPA2.0和基于标准API的查询。我所有的查询都遵循相同的模式(比较简单的属性;不需要路径导航),因此我尝试编写一个通用类来处理JPA,同时将业务逻辑保持在单独的类中。我的目标是有一个方法,给定一个实体类型和一个存储定义条件的对(字段名->所需值)的映射,返回一个bean(或bean集合),其中包含一些实体字段的值 我的所有实体都实现了Java泛型:如何从方法中获取泛型类型?,java,class,generics,types,Java,Class,Generics,Types,尽管我的问题是关于Java泛型的,但我还是放了一些与JPA相关的代码来向您展示真实的上下文 我正在使用JPA2.0和基于标准API的查询。我所有的查询都遵循相同的模式(比较简单的属性;不需要路径导航),因此我尝试编写一个通用类来处理JPA,同时将业务逻辑保持在单独的类中。我的目标是有一个方法,给定一个实体类型和一个存储定义条件的对(字段名->所需值)的映射,返回一个bean(或bean集合),其中包含一些实体字段的值 我的所有实体都实现了持久化接口,而我的所有传输对象都继承自QueryBean。
持久化
接口,而我的所有传输对象都继承自QueryBean
。我认为那些与问题无关的类,所以我跳过了它们的代码。
以下代码是我的第一种方法的一个片段(请假设cb是一个有效的CriteriaBuilder实例):
添加如下中间方法:
Class< ? extends Persistible> getTargetEntity();
public <T extends QueryBean> Collection<T> queryMany(Class<T> type, QueryConfig config, Map<String, Object> parameters) {
executeQueryEntity(type, config.getTargetEntity(), parameters);
}
public Collection queryMany(类类型、QueryConfig配置、映射参数){
executeQueryEntity(类型,config.getTargetEntity(),参数);
}
但它不会编译。我相信这里已经解释了原因:但实际上我不明白答案。
我的问题是:有没有办法避免将类
参数传递给execute方法?这是解决问题的好方法还是我应该重构整个过程?
也欢迎对代码进行任何改进 我不太明白你为什么认为你的方法有效:
QueryConfig
withClass?扩展persistable>getTargetEntity()代码>不提供编译器可以引用的类型信息,为什么您认为编译器可以“猜测”您要返回的类型,并为您执行类型检查
一种方法是在QueryConfig中提供类型信息
public interface QueryConfig <T extends Persistable> {
Class<T> getTargetEntity();
List<String> getTargetAttributes();
Map<String, FieldConfiguration> getFieldConfiguration();
}
公共接口查询配置{
类getTargetEntity();
列出getTargetAttributes();
映射getFieldConfiguration();
}
您的queryMany方法可以是:
public <T extends QueryBean, TT extends Persistible>
Collection<T> queryMany(Class<T> type,
QueryConfig<TT> config,
Map<String, Object> parameters) {
executeQueryEntity(type, config.getTargetEntity(), parameters);
}
公共
集合查询数(类类型,
查询配置,
地图参数){
executeQueryEntity(类型,config.getTargetEntity(),参数);
}
顺便说一句,你的英语其实很好。事实上,直到你指出这一点,我才注意到。@Telthien谢谢你,我已经尽了最大努力了=)你最好的成绩比许多母语人士都好!非常感谢您的努力。非常感谢!!我尝试了一些类似的方法,但是在queryMany的签名中缺少了QueryConfig的类型参数,因此编译器抱怨从类到类的转换
public interface QueryConfig <T extends Persistable> {
Class<T> getTargetEntity();
List<String> getTargetAttributes();
Map<String, FieldConfiguration> getFieldConfiguration();
}
public <T extends QueryBean, TT extends Persistible>
Collection<T> queryMany(Class<T> type,
QueryConfig<TT> config,
Map<String, Object> parameters) {
executeQueryEntity(type, config.getTargetEntity(), parameters);
}