我有以下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
项,这些项的jobData
字段是该类A
的类的子类:List<JobStatus<A>> jobStatuses = getJobsByJobDataType(A.class);
我想在编译时如何将
JobStatus
对象转换为JobStatus<T>
?我可以通过诸如
myClass.cast(js)
之类的方式以多种方式进行动态转换,但是如果myClass
是绑定JobStatus<T>
或在T,我不确定该怎么做。 >。 最佳答案
似乎您正在尝试将元素强制转换为与列表类型不同的类型。换句话说,您的返回签名为List<JobStatus<T>>
类型,其中JobStatus
不扩展JobData
,尽管您尝试将每个可分配的元素都强制转换为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());
}
}