var blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for (var c : blks) {
if (Block.class.isAssignableFrom(c)) {
blockRta.registerSubtype(c);
}
}我在行Warning:(31, 46) Unchecked assignment: 'java.lang.Class' to 'java.lang.Class<? extends PACKAGE_NAME.Block>'上得到了blockRta.registerSubtype(c);警告,但我想不出如何在不压制它的情况下修复它。
ReflectionHelper.getClasses是获取包名中所有类的静态方法,其返回类型为Class[]。Block是一个接口。RuntimeTypeAdapterFactory是gson中的一个额外类,它的源代码可以查看这里。
发布于 2020-06-09 16:11:24
由于ReflectionHelper.getClasses返回原始类型Class的数组,局部变量类型推断将对var blks使用原始类型Class[],而对于var c则使用原始类型Class。对Class使用原始类型的c允许将它传递给registerSubtype(Class<? extends Block>),不需要任何检查,但不能没有任何警告。您可以使用方法asSubclass来执行检查转换,但您必须声明一个显式的非原始变量类型,以摆脱原始类型,否则,即使是asSubclass调用的结果也将被编译器擦除为原始类型。
有两种方法。更改blks的类型
Class<?>[] blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for(var c: blks) {
if (Block.class.isAssignableFrom(c)) {
blockRta.registerSubtype(c.asSubclass(Block.class));
}
}然后,var c的类型自动更改为Class<?>。
或者只是改变c的类型
var blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for(Class<?> c: blks) {
if (Block.class.isAssignableFrom(c)) {
blockRta.registerSubtype(c.asSubclass(Block.class));
}
}https://stackoverflow.com/questions/62285756
复制相似问题