如何解决这个未经检查的分配警告?
How to fix this unchecked assignment warning?
var blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for (var c : blks) {
if (Block.class.isAssignableFrom(c)) {
blockRta.registerSubtype(c);
}
}
我在 blockRta.registerSubtype(c);
行收到 Warning:(31, 46) Unchecked assignment: 'java.lang.Class' to 'java.lang.Class<? extends PACKAGE_NAME.Block>'
警告,但我不知道如何在不抑制它的情况下解决它。
ReflectionHelper.getClasses
是静态方法获取那个包名中的所有classes,它的return类型是Class[]
。 Block
是一个接口。 RuntimeTypeAdapterFactory
是gson extra中的一个class,其源码可以查看here.
因为 ReflectionHelper.getClasses
returns 原始类型的数组 Class
,局部变量类型推断将使用此原始类型 Class[]
for var blks
反过来,var c
的原始类型 Class
。将原始类型 Class
用于 c
允许将其传递给 registerSubtype(Class<? extends Block>)
,无需任何检查,但并非没有任何警告。您可以使用方法 asSubclass
执行 checked 转换,但您必须声明一个显式的非原始变量类型,以摆脱原始类型,否则,即使 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));
}
}
var blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for (var c : blks) {
if (Block.class.isAssignableFrom(c)) {
blockRta.registerSubtype(c);
}
}
我在 blockRta.registerSubtype(c);
行收到 Warning:(31, 46) Unchecked assignment: 'java.lang.Class' to 'java.lang.Class<? extends PACKAGE_NAME.Block>'
警告,但我不知道如何在不抑制它的情况下解决它。
ReflectionHelper.getClasses
是静态方法获取那个包名中的所有classes,它的return类型是Class[]
。 Block
是一个接口。 RuntimeTypeAdapterFactory
是gson extra中的一个class,其源码可以查看here.
因为 ReflectionHelper.getClasses
returns 原始类型的数组 Class
,局部变量类型推断将使用此原始类型 Class[]
for var blks
反过来,var c
的原始类型 Class
。将原始类型 Class
用于 c
允许将其传递给 registerSubtype(Class<? extends Block>)
,无需任何检查,但并非没有任何警告。您可以使用方法 asSubclass
执行 checked 转换,但您必须声明一个显式的非原始变量类型,以摆脱原始类型,否则,即使 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));
}
}