我有以下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());
    }
}

09-11 18:11