如何修复Web3J中‘Raw use of parameterized class 'Type'’警告?
问题描述
依赖信息
<dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>4.10.3</version> </dependency>
代码场景
Function function = new Function( "functionName", List.of(), List.of( new TypeReference<DynamicArray<Uint112>>(){}, new TypeReference<DynamicArray<Uint112>>(){}, new TypeReference<DynamicArray<Uint160>>(){}, new TypeReference<DynamicArray<Uint24>>(){} ) ); // 此处触发警告:Raw use of parameterized class 'Type' List<TypeReference<Type>> outputParams = function.getOutputParameters();
代码运行正常,但上述最后一行存在原始类型使用警告,需要消除该警告的合理方案。
解决方案
方案1:使用通配符匹配任意类型
Function.getOutputParameters()的实际返回类型是List<TypeReference<?>>,直接用这个类型接收即可消除警告,这也是最贴合方法定义的写法:
List<TypeReference<?>> outputParams = function.getOutputParameters();
如果需要明确约束为Type的子类,也可以写成:
List<TypeReference<? extends Type>> outputParams = function.getOutputParameters();
两种写法都能避免原始类型的使用,同时保留代码的灵活性。
方案2:泛型方法约束具体类型
如果后续需要对输出参数做类型安全的操作,可以通过泛型方法来明确类型范围,避免强制转换带来的警告:
@SuppressWarnings("unchecked") private <T extends Type> List<TypeReference<T>> getTypedOutputs(Function function) { return (List<TypeReference<T>>) function.getOutputParameters(); } // 调用示例(根据实际返回类型调整泛型参数) List<TypeReference<DynamicArray<?>>> outputParams = getTypedOutputs(function);
这里的@SuppressWarnings("unchecked")是基于你对合约返回类型的预先了解添加的,确保类型转换的安全性。
原理说明
警告的根源是Type是泛型类,TypeReference<Type>属于未指定泛型参数的原始类型用法。通过通配符或泛型约束,让编译器明确类型的边界,从而消除警告同时保证类型安全。
内容的提问来源于stack exchange,提问作者KunLun
相关产品推荐
相关产品推荐

