Java泛型通配符返回类型警告问题求解
解决泛型通配符返回类型警告问题
原代码
public <T extends DataAgent> DataProcessor<? extends DataAgent> resolveProcessor( final String response, T dAgent) throws Exception { if (dAgent.getType() == RESULT_TYPE.INLINE) { return InlineParser.parse(response, (InlineDataAgent) dAgent); } return DefaultParser.parse(response, (DefaultDataAgent) dAgent); }
问题与背景
这段代码功能正常,但编译器会抛出警告:Generic wildcards should not be used in return types。相关背景:
InlineDataAgent与DefaultDataAgent均继承自DataAgent,各自拥有特化字段,因此需要强制转换以适配子类;DataProcessor为接口,其实现类分别绑定DefaultDataAgent或InlineDataAgent。
解决方案
方案1:让返回类型与参数泛型T绑定
修改方法返回类型为DataProcessor<T>,利用类型判断确保转换安全:
public <T extends DataAgent> DataProcessor<T> resolveProcessor(final String response, T dAgent) throws Exception { if (dAgent.getType() == RESULT_TYPE.INLINE) { // 已通过类型判断确认dAgent类型,转换安全 return (DataProcessor<T>) InlineParser.parse(response, (InlineDataAgent) dAgent); } else { return (DataProcessor<T>) DefaultParser.parse(response, (DefaultDataAgent) dAgent); } }
方案2:使用重载方法消除歧义
针对不同子类单独定义重载方法,完全规避泛型通配符和强制转换:
public DataProcessor<InlineDataAgent> resolveProcessor(final String response, InlineDataAgent dAgent) throws Exception { return InlineParser.parse(response, dAgent); } public DataProcessor<DefaultDataAgent> resolveProcessor(final String response, DefaultDataAgent dAgent) throws Exception { return DefaultParser.parse(response, dAgent); }
该方式逻辑清晰,编译器可直接推导返回类型,适合调用方能明确传入子类实例的场景。
方案3:调整Parser的泛型定义(若允许修改Parser代码)
修改InlineParser和DefaultParser的parse方法,让其返回与输入子类绑定的处理器:
- 让
InlineParser.parse返回DataProcessor<InlineDataAgent> - 让
DefaultParser.parse返回DataProcessor<DefaultDataAgent>
再修改原方法:
public <T extends DataAgent> DataProcessor<T> resolveProcessor(final String response, T dAgent) throws Exception { if (dAgent instanceof InlineDataAgent) { return (DataProcessor<T>) InlineParser.parse(response, (InlineDataAgent) dAgent); } else { return (DataProcessor<T>) DefaultParser.parse(response, (DefaultDataAgent) dAgent); } }
通过instanceof校验确保类型转换安全,同时消除警告。
内容的提问来源于stack exchange,提问作者piet
相关产品推荐
相关产品推荐

