Java 17循环泛型参数编译错误:setDetail调用失败求解决方案
解决Java泛型双向依赖的编译错误
问题代码
出现编译错误的完整代码如下:
import java.util.function.Supplier; public interface ISurvey<T extends ISurveyDetails<? extends ISurvey<T>>> { void setDetails(T details); } public interface ISurveyDetails<T extends ISurvey<? extends ISurveyDetails<T>>> { void setSurvey(T survey); } public class AppleSurvey implements ISurvey<AppleSurveyDetails> { @Override public void setDetails(AppleSurveyDetails details) { } } public class AppleSurveyDetails implements ISurveyDetails<AppleSurvey> { @Override public void setSurvey(AppleSurvey survey) { } } public class ComplexGenericUser { <T extends ISurveyDetails<ISurvey<T>>> void setDetail(ISurvey<T> survey, Supplier<T> detailMaker) { var detail = detailMaker.get(); detail.setSurvey(survey); survey.setDetails(detail); } void useWithApple() { var appleSurvey = new AppleSurvey(); setDetail(appleSurvey, AppleSurveyDetails::new); // 此处编译报错 } }
编译错误信息
调用setDetail时,编译器抛出错误:
no instance of type variable (T) exists so that AppleSurvey conforms to ISurvey<T>
错误原因
原setDetail方法的单泛型参数约束<T extends ISurveyDetails<ISurvey<T>>>过于严格,没有匹配ISurvey与ISurveyDetails之间的双向嵌套泛型关系:
AppleSurvey实现的是ISurvey<AppleSurveyDetails>AppleSurveyDetails实现的是ISurveyDetails<AppleSurvey>,而AppleSurvey属于ISurvey<AppleSurveyDetails>,因此AppleSurveyDetails实际满足的是ISurveyDetails<? extends ISurvey<AppleSurveyDetails>>- 原约束要求
T必须严格匹配ISurveyDetails<ISurvey<T>>,缺少通配符适配嵌套关系,导致编译器无法推断出合法的T类型。
解决方案
修改setDetail方法的泛型声明,用两个明确的类型参数绑定Survey和Details的双向依赖关系:
import java.util.function.Supplier; public class ComplexGenericUser { // 用两个泛型参数明确双向依赖关系 <S extends ISurvey<D>, D extends ISurveyDetails<S>> void setDetail(S survey, Supplier<D> detailMaker) { var detail = detailMaker.get(); detail.setSurvey(survey); survey.setDetails(detail); } void useWithApple() { var appleSurvey = new AppleSurvey(); setDetail(appleSurvey, AppleSurveyDetails::new); // 编译通过 } }
方案说明
该修改通过两个泛型参数S和D:
- 明确
S是实现ISurvey<D>的调查类(对应AppleSurvey) - 明确
D是实现ISurveyDetails<S>的详情类(对应AppleSurveyDetails) - 编译器可直接根据传入的实例推断出
S=AppleSurvey、D=AppleSurveyDetails,完美适配双向泛型依赖,消除编译错误。
内容的提问来源于stack exchange,提问作者mshsayem
相关产品推荐
相关产品推荐

