java - 在 Java 中强制转换为未绑定的泛型
问题描述
我有以下java伪代码
public interface JobData {}
public class JobStatus<T extends JobData> {
public T jobData;
}
public class A implements JobData {}
public class B extends A {}
public class C extends A {}
public class Service {
private Map<Long, JobStatus> jobStatusMap;
public <T extends JobData> List <JobStatus<T>> getJobsByJobDataType(Class<T> clazz)
{
return jobStatusMap.values().stream()
.filter(js -> clazz.isInstance(js.getJobData()))
.map((js) -> (JobStatus<T>) js) // HERE
.collect(Collectors.toCollection(ArrayList::new));
}
}
但是我在标有“HERE”的行上遇到了麻烦。本质上,我有一个JobStatus
对象映射,每个对象都有一个字段 ,jobData
它是实现接口的泛型JobData
。我想获取其字段是类的子类的所有JobStatus
项目,例如 class :jobData
A
List<JobStatus<A>> jobStatuses = getJobsByJobDataType(A.class);
我想在编译时如何将我的JobStatus
对象转换为JobStatus<T>
?
我可以通过多种方式进行动态转换,例如myClass.cast(js)
,但我不确定如何做到这一点,如果myClass
是一个泛型JobStatus<T>
whereT
被绑定或在clazz
.
解决方案
您似乎正在尝试将元素转换为与列表类型不同的类型。换句话说,您的返回签名是List<JobStatus<T>>
where JobStatus
does not extend的类型JobData
,尽管您正在尝试将每个可分配元素强制转换为 type JobData
。
这是你想做的吗?
public interface JobData<T> {
T getData();
}
public interface JobStatus<T extends JobData> {
T getJobData();
}
public class Service {
private Map<Long, JobStatus> jobStatusMap;
public <T extends JobData> List<JobStatus<T>> getJobsByJobDataType(Class<T> clazz) {
return jobStatusMap.values().stream()
.filter(value -> clazz.isAssignableFrom(value.getJobData().getClass()))
.map(value -> (JobStatus<T>) value)
.collect(Collectors.toList());
}
}
推荐阅读
- flutter - NoSuchMethodError:在 null 上调用了方法“[]”。颤动本地json文件
- python - UnboundLocalError: local variable.... 赋值前引用
- java - Android Studio TextView 文本选择处理程序图标位置
- c# - 如何同步调用或等待异步回调完成?
- python - 获取 python 退出状态并在 bash 命令中使用它
- reactjs - 哈希路由器和浏览器路由器出错。女巫 gh-pages
- reactjs - 父组件如何与作为 prop 传入的子组件通信?
- android - 重启广播接收器不工作 Infinix android 10 设备
- excel - Power Query Excel - 根据其他行值更新行
- axis - 在 wsdltojava 生成的类中面临编译错误