Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型:如何从方法中获取泛型类型?_Java_Class_Generics_Types - Fatal编程技术网

Java泛型:如何从方法中获取泛型类型?

Java泛型:如何从方法中获取泛型类型?,java,class,generics,types,Java,Class,Generics,Types,尽管我的问题是关于Java泛型的,但我还是放了一些与JPA相关的代码来向您展示真实的上下文 我正在使用JPA2.0和基于标准API的查询。我所有的查询都遵循相同的模式(比较简单的属性;不需要路径导航),因此我尝试编写一个通用类来处理JPA,同时将业务逻辑保持在单独的类中。我的目标是有一个方法,给定一个实体类型和一个存储定义条件的对(字段名->所需值)的映射,返回一个bean(或bean集合),其中包含一些实体字段的值 我的所有实体都实现了持久化接口,而我的所有传输对象都继承自QueryBean。

尽管我的问题是关于Java泛型的,但我还是放了一些与JPA相关的代码来向您展示真实的上下文

我正在使用JPA2.0和基于标准API的查询。我所有的查询都遵循相同的模式(比较简单的属性;不需要路径导航),因此我尝试编写一个通用类来处理JPA,同时将业务逻辑保持在单独的类中。我的目标是有一个方法,给定一个实体类型和一个存储定义条件的对(字段名->所需值)的映射,返回一个bean(或bean集合),其中包含一些实体字段的值

我的所有实体都实现了
持久化
接口,而我的所有传输对象都继承自
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
with
ClassgetTargetEntity()不提供编译器可以引用的类型信息,为什么您认为编译器可以“猜测”您要返回的类型,并为您执行类型检查

一种方法是在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);
}