首页 > 解决方案 > 在 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 :jobDataA

List<JobStatus<A>> jobStatuses = getJobsByJobDataType(A.class);

我想在编译时如何将我的JobStatus对象转换为JobStatus<T>

我可以通过多种方式进行动态转换,例如myClass.cast(js),但我不确定如何做到这一点,如果myClass是一个泛型JobStatus<T>whereT被绑定或在clazz.

标签: javaspringcasting

解决方案


您似乎正在尝试将元素转换为与列表类型不同的类型。换句话说,您的返回签名是List<JobStatus<T>>where JobStatusdoes 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());
    }
}

推荐阅读