Java泛型方法返回值改为Class<T>或Class<?>编译错误如何修复
编译错误根本原因
你修改后的方法声明返回值类型为Class<T>,但方法体中所有return语句返回的都是ParentBox类型的实例,二者类型完全不兼容,因此触发编译错误。
修复方案
根据你的需求分两种场景处理:
场景1:方法确实需要直接返回Class<T>/Class<?>类型
调整所有返回值为符合Class类型的对象,参数中传入的responseType本身就是Class<T>类型,你可以按需返回,示例代码如下:
private <T extends BaseResponse, U extends RequestEnvelope, V extends BaseTransformer> Class<T> getResponse (U payload, V transformer, String entityType, Class<T> responseType) { Box<String> box; try { box= transformAndSerialize(payload, transformer); // 正常逻辑返回你需要的Class实例,这里示例返回传入的responseType return responseType; } catch (TransformException e) { LOG.error("Failed", e); // 异常场景可按需返回null或者特定Class对象 return null; } catch (SerializeException e) { LOG.error("Failed", e); // 异常场景可按需返回null或者特定Class对象 return null; } }
如果需要返回Class<?>,只需把方法返回值声明的Class<T>改成Class<?>,返回逻辑对应调整即可。
场景2:需要保留ParentBox作为外层返回结构,仅修改内层包裹的泛型为Class<T>
调整方法返回值声明为ParentBox<Class<T>>,同时匹配返回的ParentBox实例泛型即可:
private <T extends BaseResponse, U extends RequestEnvelope, V extends BaseTransformer> ParentBox<Class<T>> getResponse (U payload, V transformer, String entityType, Class<T> responseType) { Box<String> box; try { box= transformAndSerialize(payload, transformer); // 正常逻辑返回你需要的ParentBox,包裹Class<T>实例 return new ParentBox<>(ParentBoxStatus.SUCCESS, responseType); } catch (TransformException e) { LOG.error("Failed", e); return new ParentBox<>(ParentBoxStatus.TRANSFORM_ERROR, null); } catch (SerializeException e) { LOG.error("Failed", e); return new ParentBox<>(ParentBoxStatus.SERIALIZE_ERROR, null); } }
内容的提问来源于stack exchange,提问作者Deepa Krishnamurthy
相关产品推荐
相关产品推荐

