如何修复React Native原生模块包规范中的ViewManager相关编译器警告?
修复React Native原生模块中"Raw use of parameterized class 'ViewManager'"警告的方法
问题描述
在React Native原生模块的包类中出现编译器警告:
Raw use of parameterized class 'ViewManager'
对应的完整源码:
package com.example.foobar; import androidx.annotation.NonNull; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Collections; import java.util.List; public class FooBarPackage implements ReactPackage { @NonNull @Override public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) { return Collections.emptyList(); } @NonNull @Override public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) { return Collections.singletonList(new FooBarViewManager()); } }
修复方案
原因解析
ViewManager是一个泛型类,定义为public abstract class ViewManager<T extends View, C extends ReactShadowNode>。直接使用List<ViewManager>属于未指定泛型参数的原始类型调用,不符合Java泛型的类型安全规范,因此触发编译器警告。
代码修改
将createViewManagers方法的返回类型从List<ViewManager>改为List<ViewManager<?, ?>>,通过泛型通配符明确表示兼容任意合法的泛型参数组合:
package com.example.foobar; import androidx.annotation.NonNull; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Collections; import java.util.List; public class FooBarPackage implements ReactPackage { @NonNull @Override public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) { return Collections.emptyList(); } @NonNull @Override public List<ViewManager<?, ?>> createViewManagers(@NonNull ReactApplicationContext reactContext) { return Collections.singletonList(new FooBarViewManager()); } }
补充说明
ViewManager<?, ?>的写法既遵守了Java泛型语法规则,又不会影响现有业务逻辑——你的FooBarViewManager必然是ViewManager的某个具体泛型实现,通配符可以完美兼容这种情况,同时彻底消除编译器警告。
内容的提问来源于stack exchange,提问作者friederbluemle
相关产品推荐
相关产品推荐

