gpt4 book ai didi

java - 在 Java 中转换为未绑定(bind)泛型

转载 作者:行者123 更新时间:2023-12-01 19:36:47 25 4
gpt4 key购买 nike

我有以下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 的 map 对象,每个对象都有一个字段,jobData ,这是一个实现接口(interface) JobData 的泛型。我想获得所有JobStatusjobData 的项目字段是类的子类,比如类 A :

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

我想在编译时,我该如何转换我的 JobStatus反对 JobStatus<T>

我可以通过多种方式进行动态转换,例如 myClass.cast(js) ,但我不知道如果 myClass 该怎么做是通用的JobStatus<T>哪里T被绑定(bind)或定义于 clazz .

最佳答案

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

关于java - 在 Java 中转换为未绑定(bind)泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com