Java向类构造方法传入Function接口时出现类型不兼容报错如何解决?
问题根因
你遇到的类型转换报错是多重问题共同导致的,按优先级排序如下:
- 构造方法参数类型/顺序不匹配
你的Request类构造方法定义的第一个参数是int类型的environ,但你实例化时传的第一个参数是SA_URL,这明显是字符串类型的URL,类型完全不匹配。同时构造方法第五个参数要求是Class<?>类型,你传入的是getFunnelAnswersQueries()的返回值,需要确认这个方法的返回值是否为Class类型,不匹配也会导致编译器类型检查逻辑混乱,抛出不相关的类型错误。 - 泛型使用不规范
你定义的Request是泛型类Request<T>,但实际实例化时用的是无泛型参数的原始类型,会触发泛型擦除,所有泛型相关的类型检查都会失效,本来匹配的Function类型也会被擦除为Function<Object,Object>,进而触发Object无法转换为RequestOptions的报错。而且你当前的Request类里完全没有用到泛型参数T,属于冗余定义。 - 你注释里提到的
Function<RequestOptions, Object>理论上是可以正常使用的,Integer是Object的子类,符合协变返回要求,不会有兼容问题。
修复方案
- 调整
Request类的属性和构造方法参数:- 如果你是要把URL前缀作为第一个参数,就把
environ属性的类型从int改为String,同步修改构造方法第一个参数的类型。 - 确认第五个参数的业务需求,如果需要接收查询参数,就把构造方法第五个参数的类型从
Class<?>改为getFunnelAnswersQueries()方法的返回类型,不需要的话删除该参数即可。
- 如果你是要把URL前缀作为第一个参数,就把
- 移除
Request类的冗余泛型参数T,或者实例化时明确指定泛型类型,避免使用原始类型,示例:
// 移除泛型后实例化代码 public static final Request testReqAnswers = new Request(SA_URL, 200, answersEndpoint, Requests::postStatusCode, getFunnelAnswersQueries(advisorMatchQueries, funnelResponseValues)); // 保留泛型的话指定具体类型 public static final Request<Void> testReqAnswers = new Request<>(SA_URL, 200, answersEndpoint, Requests::postStatusCode, getFunnelAnswersQueries(advisorMatchQueries, funnelResponseValues));
- 调整后
Requests::postStatusCode方法引用完全匹配Function<RequestOptions, Integer>的定义,不会再触发类型不兼容报错。
内容的提问来源于stack exchange,提问作者CoderNumber10002
相关产品推荐
相关产品推荐

